在指向数组的指针上调用memset?

jab*_*jab 1 c memset

我不认为我在这里有所了解......

bool (*lookup)[100];
memset(lookup, 0, 100 * sizeof(*lookup));
Run Code Online (Sandbox Code Playgroud)

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

前面的代码会导致段错误,memset不像指针吗?

alk*_*alk 6

通过做

memset(lookup, 0, 100 * sizeof *lookup);
Run Code Online (Sandbox Code Playgroud)

你没有" 初始化指针 ",而是指针指向的内存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. */
Run Code Online (Sandbox Code Playgroud)

或者像这样自己动手:

bool (*lookup)[100] = malloc(sizeof *lookup);
if (NULL != lookup) 
{
  memset(lookup, 0, sizeof *lookup);
 }
 else
 {
   perror("malloc() failed");
 }
Run Code Online (Sandbox Code Playgroud)

最短的解决方案是:

bool (*lookup)[100] = calloc(1, sizeof *lookup);
if (NULL == lookup) 
{
  perror("calloc() failed");
}
/* No need to memset it to 0s as this had been done by calloc() already. */
Run Code Online (Sandbox Code Playgroud)

  • @jab:不,它是一个指针变量,指向的类型是`bool [100]`。 (2认同)