这段代码需要将朋友保存在某个数组数组中(指向指针的指针),并根据名称的长度执行realloc(为每个数组的字符串构建完全动态的位置)并打印字符串和长度,一切都免费。 因此代码在我调试时工作,但是当我用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;
}
答案 0 :(得分:1)
取字符串“Hello”。 strlen(“Hello”)= 5.但是为了存储它,你需要SIX字节,而不是五个字节,因为最后有一个零字节不被strlen计算。
PS。尝试使用%d格式打印strlen时未定义的行为。可能崩溃,打印废话,或更糟。使用%zd。在编译器中打开所有警告并修复它们。
PS。 BLUEPIXY发现了一个更糟糕的问题...