C указатели с массивами в функциях с realloc - PullRequest
1 голос
/ 25 мая 2011

Привет Я медленно осваиваю указатели и косвенность, но у меня все еще есть небольшие проблемы.

В моей функции main я создаю массив структур (компьютеров), используя malloc

int arraySize = 0;//This may be the first issue
Computer    *ptrComputer = NULL; 
ptrComputer = (Computer*) malloc(sizeof(Computer) * arraySize);

Затем я передаю указатель на функцию, которая считывает данные из файла в массив

arraySize = readFileToArray(&ptrComputer, arraySize);

int readFileToArray(Computer **compArray, int arraySize){

Computer newComp;
int foundARecord = 0;
/*File stuff*/

   arraySize = extendArrays(compArray, arraySize, no_elements);

    /*Use fscanf to read file data into the newComputer variable*/
    printf("g %i\n", arraySize);
    *compArray[arraySize - 1] = newComp;//set the newly created part of the array to newComputer


return arraySize;
}

int extendArrays(Computer **compArray, int arraySize){
   arraySize++;
   //Resize the computer array
   *compArray = (Computer*)realloc(*compArray, (sizeof(Computer)*(arraySize + 1)));
   return arraySize;
}

Теперь, насколько я понимаю, я передаю адрес ptrComputer в функцию readFileToArray(). Затем он передает этот же адрес функции extendArrays(), которая изменяет его размер. Затем я пытаюсь присвоить newComp место в памяти, на которое указывает compArray. Это работает до тех пор, пока я пытаюсь записать в индекс 0, но любые другие заставляют xcode генерировать ошибку exc_bad_access. Все это очень сбивает с толку, может кто-нибудь с небольшим опытом в этом увидеть, где я иду не так? Он работал раньше, когда я передавал фактический указатель на функцию readFile, но он работал только один раз (думаю, что я перераспределяю копию указателя) Любая помощь будет очень цениться Спасибо

1 Ответ

2 голосов
/ 25 мая 2011

Вместо этого:

    *compArray[arraySize - 1] = newComp;//set the newly created part of the array to newComputer

Попробуйте это:

    (*compArray)[arraySize - 1] = newComp;//set the newly created part of the array to newComputer

Таким образом, вы явно разыменовываете compArray перед подпиской.

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