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

时间:2016-02-07 18:47:52

标签: 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;
}

3 个答案:

答案 0 :(得分:2)

你理解错了:

[Index("name", 1, IsUnique = true)]

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

答案 1 :(得分:2)

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

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

如果您使用C ++编程,那么您应该使用std::vector代替(或最坏情况下使用new[])和the standard library streams

答案 2 :(得分:2)

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

此外,建议您避免转换malloc的结果。看这里: Do I cast the result of malloc?