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

标签 c dynamic char realloc

此代码需要将 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/

相关文章:

c - 为两个连接的字符串分配内存

C-伪shell和并发

c - 以下程序的输出

php - 从 PHP 创建动态 PDF(带有表单字段和交互式元素)

在C中的递归函数中连接字符

cmake无法构建简单的项目

select - 检索SAP表数据的通用功能模块

javascript - 如何在Reactjs中创建动态字段

arrays - C 压缩器 - 数组下标的类型为 char

java - 字符串到字符数组和字符串数组