1

我编写了一个程序,它自动为一个结构分配内存,然后将该结构中的一个字段设置为零。

我想,与其只将该成员设置为零,为什么不将整个块归零呢?进来memset()

使用此功能后,我的程序不再工作。一旦我尝试为该内存块中包含的结构中的字段分配值,程序就会因分段错误错误而崩溃。

所以,这让我想知道 - 当一块内存通过malloc()/ AUTO分配时,是否有其他信息存储在这个位置,这是访问和使用这个空间所必需的?

typedef struct{
    NodeT *nodes[MAX_SIZE];
    int count; 
} stackT;

stackT stack;
stackT* ptr = &stack;

void init(stackT* stackPtr){
    //stackPtr->count = 0;
    memset(stackPtr, 0, sizeof(stackptr));
}
4

4 回答 4

5

请通过传递结构的大小而不是指针的大小来执行 memset:

memset(stackPtr, 0, sizeof(stackT));

话虽如此,malloc 将返回一个指向地址块的指针(让我们说 N 个字节)。接下来,您需要将相同的指针和大小 N. 传递给 memset。malloc 返回的指针不包含任何其他可能受到执行 memset 影响的信息。

于 2013-09-11T19:53:16.810 回答
4
memset(stackPtr, 0, sizeof(stackptr));

这是取指针的大小;的第一个元素nodes将被归零,而不是count. 使用sizeof(*stackptr)sizeof(stackT)

于 2013-09-11T19:58:25.907 回答
3

memset()是使用正确的功能:

#include <string.h>
#include <stdbool.h>

typedef struct {
   char name[30];
   int age;
   bool isMale;
} MyStruct;

MyStruct *myStruct = (MyStruct *)malloc(sizeof(MyStruct));
memset(myStruct, 0, sizeof(MyStruct));

您的代码无法按预期工作的原因sizeof(stackptr)是指针的大小,而不是struct.

于 2013-09-11T19:55:43.790 回答
3

malloc()确实存储了有关它返回的内存块大小的信息。

但是,memset()不知道也不关心大小。memset()将盲目地写入指定字节数的指定地址,无论它可能被覆盖什么。程序员有责任确保只写入有效的内存。

现在您已经决定发布您的代码,我发现您错误地使用sizeof(stackptr)了 size 而不是sizeof(stackT). 您使用的版本是使用指针的大小而不是数据结构的大小。

于 2013-09-11T19:56:04.713 回答