私はこのサイトでこの問題について十分に見てきましたが、解決策を見つけられませんでした。 私は構造体の配列を持っており、ファイルからいくつかのレコードを読み込んで構造体に格納したいと考えています。問題は、メモリの割り当てです。 これは私が使用して構造体です:C、構造体の配列内の文字列のためのメモリを割り当てる
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を読み込むために作成されたので、レコードを読み込むためにそれを修正しなければなりませんでした。
'Record ** data、'それは3つの星を追加します。 (レコードはすでに恐ろしい型付きポインタです) – joop
'typedef'の後ろにポインタを隠すべきではありません。 – user694733
も参照してください:https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – szczurcio