Передача указателя на массив структуры между функциями - PullRequest
3 голосов
/ 12 декабря 2011

У меня есть программа, которой нужно загрузить текстовое слово в слово в массив, поэтому у меня есть структура для каждого текста, определенного в

main.h

typedef struct wordTag{
 char name[MAX_WORD];
 char string[1000][MAX_WORD];
 int words;
}text;

main.c

void main(){
   int fileCount = 0;
   text *checkTexts;
   fileCount = getCheckFiles(checkTexts);

   for(i = 0; i < fileCount; i++){
    printf("Tekst navn: %s\n", checkTexts[i].name);
   }
}

file.c

int getCheckFiles(text *checkTexts){

int fileCount, i;

FILE *file;

createFileList(&file);
fileCount = countFiles(file);

createArray(checkTexts, fileCount, file);

return fileCount;



}

void createArray(text *checkTexts, int fileCount, FILE *file){
 int i, wordCount;
 FILE *textFile;
 text localText;
 char fileName[MAX_WORD + 30];


 checkTexts= (text *)malloc(fileCount * sizeof(text));

 readFileNames(file, checkTexts);

 for(i = 0; i < fileCount; i++){
  localText = checkTexts[i];
  strcpy(fileName, "./testFolder/");
  strcat(fileName, localText.name);
  openFile(&textFile, fileName);

  localText.words = countWords(textFile);

  readFileContent(textFile, localText);
  checkTexts[i] = localText;
 }

  for(i = 0; i < fileCount; i++){
  printf("Tekst navn: %s\n", checkTexts[i].name);

  }

}

Теперь, если я печатаю имя в функции createArray, все работает нормально, но если я пытаюсь напечатать в своей основной функции, я получаю ошибку сегментации (ядро сброшено).

Ответы [ 2 ]

4 голосов
/ 12 декабря 2011

Вы не инициализировали указатель checkTexts, который вы используете в main().

В C (или C ++) указатели на функции передаются значением , а не ссылкой (за исключением того, что в C ++, когда объявлена ​​функция, принимающаяссылка на тип в качестве параметра).Поэтому, когда вы вызываете getCheckFiles(checkTexts), не имеет значения, что getCheckFiles() делает с переданным параметром - он не меняет main() переменную checkTexts.

То же самое тогдапроисходит в вашем звонке на createArray().Таким образом, хотя вы создаете массив вниз в createArray(), указатель на буфер, который вы используете malloc, никогда не передается обратно по цепочке вызовов.

1 голос
/ 12 декабря 2011

Проблема в том, что вызов malloc в createArray не связывает блок памяти с адресом, который вы указали (checktexts), как вы можете молчаливо предположить, скорее он обеспечивает новый указатель на блок памяти, который он зарезервировал. Значение checkTexts (адрес памяти), которое вы указали, перезаписывается в createArray; checkTexts также может быть локальной переменной. Однако, когда возвращается createArray, это все еще старый , неинициализированный адрес, на который checkTexts ссылается в main, и память по этому адресу (вероятно) такая же, как и раньше, а именно либо нераспределенная или зарезервировано для кого-то еще. Итак, ошибка сегментации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...