我很难弄清楚我的程序出了什么问题。我正在尝试通过在createNode函数中创建节点,然后使用addNode将它们添加到列表头部来创建链接列表。当我尝试创建节点并且出现分段错误时,程序失败。malloc问题,C中的内存泄漏
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include "list.h"
struct listnode {
int line;
char *word;
struct lnode *next;
};
struct listnode* createNode (char* word, int line) {
int strlen1 = strlen(word)+1;
struct lnode *node = malloc(sizeof(struct lnode));
node->word = malloc(sizeof(char)*strlen1);
strcpy(node->word,word);
node->word[strlen1] = '\0';
node->next = NULL;
node->line = line;
return node;
}
void addNode (struct listnode** head, struct listnode* node) {
if ((*head)==NULL){
head = &node;
}
else if((*head)->next!=NULL){
struct lnode *temp = *head;
node->next = *head;
}else if(*head!=NULL&&(*head)->next==NULL){
(*head->next) = node;
}
}
通过运行Valgrind的程序产生以下错误:
==14661== Command: ./testlist
==14661==
==14661== Invalid write of size 1
==14661== at 0x4006E3: createNode (in /u/data/u95/testprogs/testlist)
==14661== by 0x40091C: main (in /u/data/u95/testprogs/testlist)
==14661== Address 0x51dc0a6 is 0 bytes after a block of size 6 alloc'd
==14661== at 0x4C2AF5D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64 linux.so)
==14661== by 0x4006AF: createNode (in /u/data/u95/testprogs/testlist)
==14661== by 0x40091C: main (in /u/data/u95/testprogs/testlist)
==14661==
==14661== Use of uninitialised value of size 8
==14661== at 0x40071C: addNode (in /u/data/u95/testprogs/testlist)
==14661== by 0x400933: main (in /u/data/u95/testprogs/testlist)
==14661== Uninitialised value was created by a stack allocation
==14661== at 0x4008E8: main (in /u/data/u95/testprogs/testlist)
==14661==
==14661== Invalid read of size 8
==14661== at 0x40071C: addNode (in /u/data/u95/testprogs/testlist)
==14661== by 0x400933: main (in /u/data/u95/testprogs/testlist)
==14661== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==14661==
==14661==
==14661== Process terminating with default action of signal 11 (SIGSEGV)
==14661== Access not within mapped region at address 0x0
==14661== at 0x40071C: addNode (in /u/data/u95/testprogs/testlist)
==14661== by 0x400933: main (in /u/data/u95/testprogs/testlist)
==14661== If you believe this happened as a result of a stack
==14661== overflow in your program's main thread (unlikely but
==14661== possible), you can try to increase the size of the
==14661== main thread stack using the --main-stacksize= flag.
==14661== The main thread stack size used in this run was 8388608.
我是新的C和我不知道为什么被抛出这些错误。有人可以帮忙吗?
您不需要将终止符添加到'createNode'中的字符串,它是由'strcpy'自动完成的。 – 2013-02-16 19:34:02
向我们展示'main'中的代码。你有至少1个堆栈上的节点吗? – 2013-02-16 19:35:41
在函数'addNode'中,语句'head = &node;'将局部变量'node'的地址赋给'head'。 'node'对于函数'addNode'是局部的 – sgarizvi 2013-02-16 19:35:46