我在这个网站上看到了这个问题,但仍然没有找到解决方案。 我有一个struct数组,我想从文件中读取一些记录并将它们存储在结构中。问题是内存的分配。 这是我使用的结构:
struct Rec{
int mat;
char *nome;
char *cognome;
};
typedef struct Rec* Record;
这是readFromFile函数:
void readFromFile(char* fileName, Record** data, int* pn)
{
char line[LINE_LENGTH];
int n, i;
char* token;
printf("\n\nReading file %s\n", fileName);
FILE* fin = fopen(fileName, "r");
if (fin == NULL)
{ printf("Error readinf file\n");getch();
goto end;
}
n = 0; // first read to know the number of lines
while (fgets(line, LINE_LENGTH, fin) != NULL) n++;
n = (n < MAX_LENGTH ? n : MAX_LENGTH);
printf("N: %d\n", n);
*pn = n;
//Then I allocate the memory for the n lines I previously read
*data = (Record*)malloc(n * sizeof(Record));
if(*data == NULL){
printf("Problem allocating memory\n");
exit(0);
}
i = 0;
for(i = 0; i < n; i++){
(*data)[i].nome = malloc(sizeof(char) * MAX_LENGTH + 1);
if((*data)[i]->nome == NULL){
printf("Problem allocating memory\n");
exit(1);
}
//Here comes the problem, the allocation of the second string fails and the program exit
(*data)[i]->cognome = malloc((sizeof(char) * MAX_LENGTH + 1));
if((*data)[i]->cognome == NULL){
printf("Problem allocating memory\n");
exit(2);
}
}
rewind(fin);
n = 0;
while (fgets(line, LINE_LENGTH, fin) != NULL && n < MAX_LENGTH)
{
token = strtok(line, ";");
strcpy((*data)[n]->nome, token);
token = strtok(line, ";");
strcpy((*data)[n]->cognome, token);
token = strtok(line, ";");
(*data)[n]->mat = atoi(token);
n++;
}
fclose(fin);
end:return;
}
我试图在很多方面修改结构和代码,但还没有找到解决方案,我认为这可能是一个指针问题,但我无法弄明白。 readFromFile函数是由教授提供的,用于从文件中读取int,我必须修改它才能读取记录。
答案 0 :(得分:0)
Record
定义为
typedef struct Rec* Record;
因此它是指向struct Rec的指针。 malloc
返回指向已分配内存(或NULL
)的指针,但是将其转换为指向指针的指针
*data = (Record*)malloc(n * sizeof(Record));
// = Rec**
答案 1 :(得分:0)
之间存在很大差异:
(*data)[i].nome = malloc(sizeof(char) * MAX_LENGTH + 1);
和
(*data)[i]->cognome = malloc((sizeof(char) * MAX_LENGTH + 1));
使用点符号的第一行暗示访问struct
的成员,而 - &gt;意味着使用指针表示法访问struct
的成员,即指向结构的指针。
混淆显示在那里,因为(*data)
是指向Record
类型结构的指针,它是Rec
的类型定义。
typedef struct Rec* Record;
自从data
被剥离后,是Record
的类型定义,别名为指向Rec
结构的指针。作为参数的一部分的双指针,将通过引用传递进行修改,在确定输入数据集中的行数后,声明为指针数组:
*data = (Record*)malloc(n * sizeof(Record));
访问成员数据,对于数组中的每个条目将是:
(*data)[i] dot name_of_member
如果类型定义如下,则规则会发生变化:
typedef struct Rec Record;
即。一个普通的结构,没有指针使用。
然后访问会员数据,,如果分配,
(*data)[i]->name_of_member
然而,不要尝试在typedef
后面隐藏指针,因为这会让人感到悲伤,将来再次回到代码中,并想知道它失败的原因,隐藏指针有咬你了!