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

Cant Add Item to Array of Structs in C

我无法将项目添加到结构数组并且无法弄清楚原因。这是它的样子:结构:

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;
    

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

    char buffer[SOME_REASONABLE_SIZE];
    

    那么问题是sizeof(buffer[0]) != sizeof(&buffer[0]),因此指针运算将是fscanf()中的一个问题。

  3. 这是错误的,您为 data 字段分配了错误的金额。一个 c 字符串由一个非 nul 字节序列和一个 nul 字节组成,你正在为非 nul 部分分配 space 只是因为 strlen() returns 非-null 字符的数量,strcpy() 将复制 '[=28=]' 因此您的程序将调用未定义的行为,复制字符串的正确方法是

    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() 搜索 '[=28= ]' 再次.

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

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