#arrays #c #pointers #struct
#массивы #c #указатели #структура
Вопрос:
Я пытаюсь выяснить, как сохранить значения из входного файла в массив указателей на структуры. Входной файл выглядит следующим образом (сначала имя в структуре, а следующие числа должны быть сохранены в массив целых чисел внутри структуры). Промежуточные инструкции print помогают мне увидеть, где происходит сбой программы.
МОЙ КОД:
typedef struct{
char name[10];
int songs[10];
}Customer;
Customer *memory_locations[100];
int main(int argc, char* argv[])
{
FILE *fp_data = fopen(argv[1], "r"); //file with tree structure
FILE *fp_query = fopen(argv[2], "r"); //file with commands
int index = 0;
char targetCust[10];
char buffer;
fscanf(fp_data, "%sn", targetCust);
while(!feof(fp_data)){
printf("1%d", index);
memory_locations[index] = (Customer *)malloc(sizeof(Customer));
printf("2%d", index);
fscanf(fp_data, "%s" , memory_locations[index]->name);
printf("3%d", index);
for(int i = 0; i<10; i ){
fscanf(fp_data, " %d", memory_locations[index]->songs[i]);
printf("4%d", index);
}
printf("5%d", index);
index ;
}
printf("%d %s", index, targetCust);
}
ВХОДНОЙ ФАЙЛ:
Alice
Alice 4 2 0 2 0 0 5 3 3 2
Bob 0 0 1 2 0 3 5 1 1 5
Carol 0 2 0 0 2 1 0 1 1 2
David 2 2 0 2 1 2 3 1 3 0
Emily 0 4 0 2 5 5 4 3 0 3
На выходе возвращается 102030, а затем ошибка сегментации, поэтому проблема заключается в считывании целых чисел из входного файла. Является ли целевое местоположение из fscanf() неправильным, поскольку это массив указателей на структуры? Это единственное, о чем я могу думать, но не знаю, как это сделать правильно.
Комментарии:
1. хотя печать может быть индикатором, я бы посоветовал попробовать использовать отладчик, поскольку он может быть намного более информативным, и другим инструментом, который может быть эффективным в этом типе сценариев, может быть valgrind.
Ответ №1:
Является ли целевое местоположение из fscanf() неправильным, поскольку это массив указателей на структуры?
Нет, fscanf неверен, потому что в программе есть небольшая опечатка. fscanf
нужны указатели в параметрах. Остальная часть кода кажется нормальной.
fscanf(fp_data, " %d", memory_locations[index]->songs[i]); // Segfault
fscanf(fp_data, " %d", amp;memory_locations[index]->songs[i]); // Correct
^
Для name
, нет проблем, потому memory_locations[index]->name
что соответствуют адресу начала таблицы.