C语言 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("%dn", sizeof list);
    fclose(fileRead);
    return list;
}

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


通常的链接:不要在 C 中强制转换 malloc 的返回(或任何其他返回 void * 的函数)。

如果你用C++编程,那么你应该使用std::vector代替(或最坏的情况使用new[])和标准库流。

你理解错了:

sizeof list

返回指针的大小,而不是分配的内存的大小。

你的错误在于你取sizeof list的行,因为它打印了列表指针的大小,即 4 个字节。您想改为打印lineCounter

此外,建议您避免投射malloc的结果。看这里:我是否施放了马洛克的结果?

相关内容

  • 没有找到相关文章

最新更新