在指向数组的指针上调用 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?的主要内容,如果未能解决你的问题,请参考以下文章