结构的Malloc有问题
我不断地在一小部分代码中出现分段错误,我不知道为什么,我使用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电话吗?更有
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标准中。