Сохранение значений в массив указателей на структуры

#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 что соответствуют адресу начала таблицы.