结构的Malloc有问题

结构的Malloc有问题,c,pointers,struct,malloc,C,Pointers,Struct,Malloc,我不断地在一小部分代码中出现分段错误,我不知道为什么,我使用malloc,看不出任何原因,就像它碰到数据部分一样,它崩溃了。 数据如下: listNode* node = (listNode*)malloc(sizeof(listNode)); <-This is the Line strcpy(node->entry, string); node->next = NULL; 数据确实在某一点被释放,但无法到达该点。 谢谢你的帮助 你确定你在打malloc电话吗?更有

我不断地在一小部分代码中出现分段错误,我不知道为什么,我使用malloc,看不出任何原因,就像它碰到数据部分一样,它崩溃了。 数据如下:

listNode* node = (listNode*)malloc(sizeof(listNode));    <-This is the Line
strcpy(node->entry, string); 
node->next = NULL;
数据确实在某一点被释放,但无法到达该点。
谢谢你的帮助

你确定你在打
malloc
电话吗?更有可能的是,您在strcpy上崩溃了。事实上,这种情况下的strcpy几乎肯定会导致不良行为,尽管准确地说,行为是未定义的

只要没有填满堆,
malloc
就应该成功。但是,由于您调用了
malloc
而不是
calloc
,因此无法保证
node->entry
的内容。C标准没有定义使用
malloc
分配的内存中存储的内容,因此
node->entry
中充满了垃圾。通过尝试复制到错误的指针,您的应用程序因试图访问错误的内存地址而崩溃


Alexey Frunze在修复-
malloc
空间上100%正确,并将
节点->条目更改为指向新分配的内存,然后将
字符串
复制到
节点->条目
。这避免了使用未初始化指针的未定义行为,如我在中所述。

您确定要在
malloc
调用中崩溃吗?更有可能的是,您在strcpy上崩溃了。事实上,这种情况下的strcpy几乎肯定会导致不良行为,尽管准确地说,行为是未定义的

只要没有填满堆,
malloc
就应该成功。但是,由于您调用了
malloc
而不是
calloc
,因此无法保证
node->entry
的内容。C标准没有定义使用
malloc
分配的内存中存储的内容,因此
node->entry
中充满了垃圾。通过尝试复制到错误的指针,您的应用程序因试图访问错误的内存地址而崩溃


Alexey Frunze在修复-
malloc
空间上100%正确,并将
节点->条目更改为指向新分配的内存,然后将
字符串
复制到
节点->条目
。这避免了使用未初始化指针的未定义行为,如我在中所述。

您没有为
条目
指针分配内存。您试图将
字符串
复制到未初始化指针
项指定的伪位置
。您可以这样做:

node->entry = malloc(strlen(string) + 1);
strcpy(node->entry, string);

您没有为
指针分配内存。您试图将
字符串
复制到未初始化指针
项指定的伪位置
。您可以这样做:

node->entry = malloc(strlen(string) + 1);
strcpy(node->entry, string);

您没有为条目指针分配内存。与allocationg结构一样,只为*条目指针分配了4个字节 你应该这样做

listNode*节点=(listNode*)malloc(sizeof(listNode));//为结构分配内存 node->entry=malloc(strlen(string)+1);//为字符串分配内存 strcpy(节点->条目,字符串)//复制字符串


现在它将正常运行

您没有为条目指针分配内存。与allocationg结构一样,只为*条目指针分配了4个字节 你应该这样做

listNode*节点=(listNode*)malloc(sizeof(listNode));//为结构分配内存 node->entry=malloc(strlen(string)+1);//为字符串分配内存 strcpy(节点->条目,字符串)//复制字符串


现在它将正常运行

您为结构本身分配了内存。但你并没有在其中寻找指针,而是为结构本身分配了内存。但是你没有在它里面找到指针,或者
node->entry=strdup(string)哎呀,我都没注意到,呵呵,我习惯于对我应该使用的数据抛出分段错误,哈哈,谢谢@约翰3136,如果有的话。它不在1999年的C标准中。或者
node->entry=strdup(string)哎呀,我都没注意到,呵呵,我习惯于对我应该使用的数据抛出分段错误,哈哈,谢谢@约翰3136,如果有的话。它不在1999年的C标准中。