gpt4 book ai didi

无法将项目添加到 C 中的结构数组

转载 作者:行者123 更新时间:2023-11-30 15:22:58 25 4
gpt4 key购买 nike

我无法将项目添加到结构数组中,并且无法弄清楚为什么。它看起来像这样:结构:

typedef struct node
{
char *data;
int count;
};

数组初始化:

struct node* list = malloc(100 * sizeof(struct node));

添加部分:(从文件中读取缓冲区)

fscanf( fp, "%s", &buffer);

list[ index].data = (char*)malloc(strlen( buffer));
strcpy( list[ index].data, buffer);
list[ index].count = 0;
index++;

最佳答案

您的代码存在三个问题

  1. 这是不安全的,像这样使用 fscanf() 是危险的。您需要告诉 fscanf() 在一定数量的字符后停止读取以避免缓冲区溢出,例如

    char buffer[100];
    if (fscanf(fp, "%99s", buffer) != 1)
    doNot_Try_to_copy_buffer_itWasNotInitialized();
  2. 您将 buffer 的地址传递给 fscanf() 这是错误的,为什么?取决于你如何声明buffer,如果你声明它像

    char buffer;

    这是错误的,因为你将只有一个字符的空间,并且几乎肯定你的程序将调用未定义的行为,如果你将其声明为

    char buffer[SOME_REASONABLE_SIZE];

    那么问题是 sizeof(buffer[0]) != sizeof(&buffer[0]) 因此指针算术将成为 fscanf() 内部的问题.

  3. 这是错误的,您为 data 字段分配了错误的金额。 C 字符串由一系列非 nul 字节组成,后跟一个 nul 字节,您仅为非 nul 部分分配空间由于 strlen() 返回非--null 字符的数量,strcpy() 将复制 '\0' 因此您的程序将调用未定义的行为,复制字符串的正确方法是

    size_t length = strlen(buffer);
    list[index].data = malloc(1 + length);
    if (list[index].data != NULL)
    memcpy(list[index].data, buffer, 1 + length);

    请注意,我使用了 memcpy() 因为 length 已经用 strlen() 计算出来了,所以我不想要 strcpy() 再次搜索 '\0'

您的代码不安全,因为您忽略了所使用函数的返回值,这可能会导致未定义的行为。

注意:正如评论中提到的,在 c 中强制转换 void * 是不鼓励和不必要的,并且大多数 c 程序员并不理解 link 中提到的问题由@SouravGhosh 发布。

关于无法将项目添加到 C 中的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961329/

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