我正在研究读取文本文件的函数。函数应找出文本文件有多少条记录,并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
的结果。看这里:我是否施放了马洛克的结果?