c - Malloc 不会创建具有所需大小的结构数组

标签 c arrays struct malloc

我正在研究读取文本文件的函数。函数应该找出文本文件有多少条记录和 malloc结构体数组。它必须是结构数组,因为它是在我的作业中指定的。 LineCounter保存数组应该有多大的值。它的值为 17,这是正确的,但是当我 malloc 时数组的大小只有 4结构。我正在用 C 编程,我还包括 <stdlib.h>但编译器仍然强制我转换 malloc。

// SEPARATE HEADER FILE
#pragma once
#define FILECITATEL "citatel.txt"   // textovy subor obsahujuci zoznam citatelov
typedef struct Citatel {
    int id;               // id cislo citatela
    char meno[20];        // meno citatela
    char priezvisko[30];  // priezvisko citatela        
};

Citatel *getReaders();
void printReaders(Citatel *listOfReaders);
// END OF HEADER FILE

Citatel *getReaders() {

    FILE *fileRead;

    fileRead = fopen(FILECITATEL, "r");
    if (fileRead == NULL) {
        printf("File cannot be opened!...");
        return NULL;
    }

    char readCharacter;
    int lineCounter = 0;

    while ((readCharacter = fgetc(fileRead)) != EOF) {
        if (readCharacter == '\n') lineCounter++;
    }

    if (readCharacter == EOF) lineCounter++;

    rewind(fileRead);

    Citatel *list = (Citatel *)malloc(lineCounter * sizeof(Citatel));

    for (int i = 0; i < lineCounter; i++) {
        fscanf(fileRead, "%d %s %s", &list[i].id, &list[i].meno, &list[i].priezvisko);
    }

    printf("%d\n", sizeof list);

    fclose(fileRead);

    return list;
}

最佳答案

变量list是一个指针,当你获取list的大小时,你得到的是指针的大小,而不是它所指向的内容到。您需要跟踪自己分配的内存。

<小时/>

通常的链接:Don't cast the return of malloc in C (或任何其他返回 void * 的函数)。

如果您使用 C++ 进行编程,那么您应该使用 std::vector相反(或者最坏的情况下使用 new[])和 the standard library streams .

关于c - Malloc 不会创建具有所需大小的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35257581/

相关文章:

python - 大量小文件的 C 与 Python I/O 性能对比

java - 为什么数组元素必须是同一类型

arrays - 集合/数组包含方法

c - 作为 sizeof 操作数的结构名称

c - c 中带有标识符的结构声明

预处理阶段不断折叠

c++ - MPI 分布式、无序工作

java - 在字符串数组上使用快速排序

c - 将文件中的单词加载到 C 中的数组中

c++ - 当内部指针偏移量已知时,抑制 valgrind 中的 "possibly lost"错误