我需要在程序中使用链表的算法。我会尽快解释它需要做什么:
我的程序生成一个最大大小为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时,我有什么问题吗?
感谢您的帮助!
答案 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);