2

我不认为我在这里理解了什么......

bool (*lookup)[100];
memset(lookup, 0, 100 * sizeof(*lookup));

我正在尝试初始化一个指向堆栈分配数组的指针(该指针只会传递给堆栈框架内的调用)。memset 用于将数组初始化为 0。

前面的代码导致segfault,memset不喜欢指针吗?

4

1 回答 1

6

通过做

memset(lookup, 0, 100 * sizeof *lookup);

您不是“初始化指针”而是指针指向的内存lookup

而且很可能您在调用之前没有使指针指向某个有效内存,memset()因此写入随机内存会调用未定义的行为,从而导致程序崩溃。

有几种方法可以获得有效内存。

像这样从堆栈中获取它:

bool lookup_instance[100] = {0};
bool (*lookup)[100] = &lookup_instance;
/* No need to memset it to 0s as this had been done by ... = {0} already. */

或者像这样自己得到它:

bool (*lookup)[100] = malloc(sizeof *lookup);
if (NULL == lookup) 
{
  perror("malloc() failed"):
}
else
{
  memset(lookup, 0, sizeof *lookup);
}

最短的解决方案是:

bool (*lookup)[100] = calloc(1, sizeof *lookup);
if (NULL == lookup) 
{
  perror("calloc() failed");
}
else
{
  /* No need to memset it to 0s as this has been done by calloc() already. */
}
于 2013-10-21T16:00:48.930 回答