0

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

我的程序生成一个最大大小为 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 时,我做错了什么吗?

谢谢你的帮助!

4

2 回答 2

3

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

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

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

于 2013-10-12T18:39:28.717 回答
1

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

请注意,根据定义, sizeof(char) 为 1,并且您不应强制转换 malloc 的返回值。你的代码应该是

char * text = malloc(strlen(M) + 1);
于 2013-10-12T18:39:21.017 回答