gpt4 book ai didi

代码在调试时可以工作,但在运行时代码崩溃了

转载 作者:行者123 更新时间:2023-11-30 20:23:18 24 4
gpt4 key购买 nike

此代码需要将 friend 保存在某个数组数组中(指针到指针),并根据名称的长度进行重新分配(为每个字符串构建精确的动态位置),然后打印字符串和长度以及释放一切。因此,代码在我调试时可以工作,但是当我使用 CTR+f5 运行它时,它在第一个字符串的 fgets 之后崩溃了。此外,所有自由循环和自由函数在这里都不起作用,但如果删除它,调试仍然有效,而 CTR+f5 仍然不起作用。帮助某人?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 20

int main(void)
{
int i = 0, j = 0,friends=0;
char str[LENGTH];
printf("Hello bro,how U doin'?\nTell me how many friends do you have?\n");
scanf("%d",&friends);
char** friendBook = (char**)malloc(sizeof(char)*friends);
if (friendBook)
{
getchar();
for (i = 0; i < friends; i++)
{
*(friendBook+ i) = malloc(LENGTH*sizeof(char));
}
for (i = 0; i < friends; i++)
{
printf("Enter friend number: %d\n", i + 1);
fgets(str, LENGTH, stdin);
str[strcspn(str, "\n")] = 0;
*(friendBook + i) = (char*)realloc(*(friendBook+i),(sizeof(char)*strlen(str))); // dynamic memory for every string(name)
if (*(friendBook + i))
{
strcpy(*(friendBook+i),str);
}
}
for (i = 0; i < friends; i++)
{

printf("Friend: %s\tLength of friend name %d\n", *(friendBook + i), strlen(*(friendBook + i)));
}
}
for (i = 0; i <friends; i++)
{
free(*(friendBook+i));
}
free(friendBook);
system("PAUSE");
return 0;
}

最佳答案

取字符串“Hello”。 strlen ("Hello") = 5。但是要存储它,您需要 6 个字节,而不是 5 个字节,因为末尾有一个 0 字节不被 strlen 计算在内。

PS。当您尝试以 %d 格式打印 strlen 时出现未定义的行为。可能会崩溃、打印出无意义的内容,甚至更糟。使用%zd。打开编译器中的所有警告并修复它们。

PS。 BLUEPIXY 发现了一个更糟糕的问题...

关于代码在调试时可以工作,但在运行时代码崩溃了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36497520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com