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

Posted

技术标签:

【中文标题】在指向数组的指针上调用 memset?【英文标题】:Calling memset on pointer to array? 【发布时间】:2013-10-21 15:57:35 【问题描述】:

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

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

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

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

【问题讨论】:

堆栈分配数组”在哪里? memset 喜欢指针就好了;如果您在指针占用的内存上调用它,memset(&loopkup, 0, sizeof(lookup)); 代码将是有效的(尽管有些毫无意义)。如所写,您使用从未初始化的指针变量中检索到的 indeterminate 地址调用它,因此这是未定义的行为。 传递给memset的大小必须与指针指向的对象一致。发布的代码具有未定义的行为,因为指针未初始化,否则发布初始化指针的代码。 【参考方案1】:

通过做

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. */

【讨论】:

但是100* 没有意义,因为sizeof 已经获得了数组的大小,而不是成员。 @rodrigo: Huu .. 是我写的吗?一定是暂时的脑筋急转弯……还是谢谢!已更正! @rodrigo:啊,知道了,我从 OP 那里复制的。该死的复制和粘贴编程......: 我的印象是 bool (*lookup)[100];分配一个数组并返回一个指向其第一个元素的指针。 @jab: 不,它是一个指针变量,其中指向的类型是bool[100]

以上是关于在指向数组的指针上调用 memset?的主要内容,如果未能解决你的问题,请参考以下文章

在 STM32 上调用 memset 时出现硬故障异常

C - memset vs free

memset清空指针是怎么用的?

memset函数

memset初始化指针指向

C语言中,memset函数都可以给啥类型的数组清零?