我需要在我的程序中使用链表算法。我将快速解释它需要做什么:
我的程序生成一个最大大小为 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,它运行良好(例如,如果我不关心结构的大小并将其直接放在我的元素上)。在调试模式下,它不会崩溃,所以我认为这是某种我还无法解决的内存问题。
当我打电话给malloc时,我做错了什么吗?
感谢您的帮助!
您没有为文本分配足够的空间。您还应该考虑空字符的空间,因此分配 strlen(M)+1 字节。
sizeof(char)
始终是一个字节,您无需对 malloc 结果进行类型转换,因为 void * 会自动安全地提升为任何其他指针类型。
将代码更改为char * text = malloc(strlen(M)+1);
您没有为空终止符分配空间。分配字符串时将 strlen()+1 传递给 malloc。请记住,strlen() 返回字符串的长度,不包括 null 终止字符。
请注意,根据定义,sizeof(char) 为 1,并且不应强制转换 malloc 的返回值。你的代码应该是
char * text = malloc(strlen(M) + 1);