调试时代码工作,但运行时代码崩溃

时间:2016-04-08 10:38:13

标签: c dynamic char realloc

这段代码需要将朋友保存在某个数组数组中(指向指针的指针),并根据名称的长度执行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;
}  

1 个答案:

答案 0 :(得分:1)

取字符串“Hello”。 strlen(“Hello”)= 5.但是为了存储它,你需要SIX字节,而不是五个字节,因为最后有一个零字节不被strlen计算。

PS。尝试使用%d格式打印strlen时未定义的行为。可能崩溃,打印废话,或更糟。使用%zd。在编译器中打开所有警告并修复它们。

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