提问人:huntrese 提问时间:2/2/2023 更新时间:2/2/2023 访问量:54
Malloc 奇怪的崩溃
Malloc strange crashes
问:
我正在尝试用 C 语言实现链表,然后我决定实现相同的逻辑来创建一个“字符串”,本质上是具有更多函数的相同链表,主要是从输入字符串创建链表对象。当给定一个小的输入字符串(如 35 个字符)时,代码运行良好,但当输入字符串较大时,malloc 在第一次运行时崩溃。现在我尝试在另一台机器上运行此代码,它可以完美地处理任何大小的字符串(低于 1000 个字符),所以我怀疑我的机器有问题,以下是原因:
struct Map
{
char val;
struct Map *next;
};
void makeString(struct Map **head, char *needStr){
int i = 0;
while (needStr[i] != '\0'){
insert(head, needStr[i]);
i++;
}
}
void insert(struct Map **head, char value){
printf("%c", value);
if ((*head) == NULL)
{
(*head) = (struct Map *)malloc(sizeof(struct Map));
(*head)->val = value;
(*head)->next = NULL;
}
else
{
struct Map *cur = *head;
while (cur->next != NULL)
{
cur = cur->next;
}
struct Map *New = (struct Map *)malloc(sizeof(struct Map));
New->val = value;
New->next = NULL;
cur->next = New;
}
}
int main()
{
struct Map *list = NULL;
char *a = (char*) malloc(sizeof(char));
scanf("%[^\n]",a);
makeString(&string, a);
}
为了更直观地了解问题,下面是一个示例:
输入:
喂,你好吗?
输出:
喂,你好吗?
代码可以工作,运行在 main 中调用的所有其他函数。
输入: "******************************************************************************************************************************************************"
输出: "*"
vscode 指出 malloc 在 insert 函数中出现错误,该错误发生在第一次迭代中。
答:
3赞
Some programmer dude
2/2/2023
#1
问题就在这里:
malloc(sizeof(char));
为单个字符分配空间。如果读取字符串,则只能适合字符串终止符。
您需要确保有足够的空间来容纳所有输入以及字符串终止符。
我建议你创建一个实际的数组,具有固定的大小,然后用它来读取你的输入行。这样可以更容易地限制输入:fgets
char a[256];
fgets(a, sizeof a, stdin);
如果您担心缓冲区中留下的换行符,请参阅此旧答案。fgets
并记得检查是否成功。fgets
评论
0赞
huntrese
2/2/2023
您好,感谢您的帮助,这确实使程序正常工作,但是我主要试图了解为什么前一个程序没有,尤其是它在另一台计算机上工作的部分。
1赞
Some programmer dude
2/2/2023
@huntrese 如果只分配了一个字符,并且大小大于零的字符串将超出分配的内存范围。越界会导致未定义的行为。不幸的是,如果你有未定义的行为,通常很难预测会发生什么。如果你不走运,一切似乎都会奏效,如果你幸运的话,它就会崩溃。
评论