多次使用函数时程序崩溃

时间:2013-10-12 18:35:31

标签: c struct malloc

我需要在程序中使用链表的算法。我会尽快解释它需要做什么:

我的程序生成一个最大大小为2.000的字符串。我需要创建以下类型的元素的链接列表:

typedef struct List * News;


 struct List { 
 char * Text; 
 News next;
} ;

由于结构的最大大小是2.000,要将一个结构的信息放在我的文本字段中,我想使用结构的确切大小。因此,我创建了以下函数来创建并在链接列表的顶部添加一个元素:

void InsertLL (News p, char M[]){

 char * text = (char *)malloc(strlen(M) * sizeof(char));
 strcpy(text, M);
 News s,t;
 t = malloc(sizeof(struct List));
 t-> Text = text;
 s=p;
 p=t;
 t -> next = s;

 }

程序在无限循环中运行,经过一段时间的运行后,它崩溃了。如果没有InsertLL函数,它运行良好(例如,如果我不关心我的struct的大小并将其直接放在我的元素上)。在调试模式下,它不会崩溃,所以我认为它是某种我无法解决的内存问题。

当我打电话给malloc时,我有什么问题吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您没有为文本分配足够的空间。你应该考虑空字符的空格,所以分配strlen(M)+1个字节。

sizeof(char)总是一个字节,您不需要对malloc结果进行类型转换,因为void *会自动安全地提升为任何其他指针类型。

将代码更改为char * text = malloc(strlen(M)+1);

答案 1 :(得分:1)

您没有为null终止符分配空间。在分配字符串时将strlen()+ 1传递给malloc。请记住,strlen()返回字符串的长度,不包括空终止字符。

请注意,根据定义,sizeof(char)为1,而should not cast the return value of malloc为{{3}}。 你的代码应该是

char * text = malloc(strlen(M) + 1);