Динамическое распределение массива структуры внутри функции - PullRequest
2 голосов
/ 15 июня 2011

Я пытаюсь выделить массив структур внутри функции.

Моя структура выглядит следующим образом:

 typedef struct{
      uint16_t  taskNumber;
      uint16_t  taskType;          
      double    lat;               
      double    lon;               
      double    speed;             
      uint8_t   successCriteria;   
      uint16_t  successValue;      
      uint8_t   nextPoint;      
 }missionPoint;

В моем коде я объявляю указатель missionPoint, который затем передаюв функцию, которая будет динамически выделять его после анализа файла и выяснения, насколько большим он должен быть.В настоящее время мой код выглядит следующим образом:

 missionPoint* mission;    //declaring the pointer
 parseMission(mission);

Функция parseMission затем проанализирует определенный файл и выяснит, сколько мне нужно MissionPoints, а затем распределит его следующим образом:

где n - это проанализированное число необходимых мне миссионерских точек.

Проблема в том, что внутри функции я могу видеть правильные значения, но не за ее пределами;как только функция возвращается, как будто ничего не случилось.

Буду признателен за помощь в том, чтобы функция изменила исходный указатель, и я мог видеть данные извне функции.

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Вам нужно передать ссылку на указатель, то есть двойной указатель, потому что сам адрес будет изменен:

missionPoint *mission;
parseMission(&mission);

Аргумент parseMission теперь должен иметь тип missionPoint ** вместо missionPoint *:

*mission = (missionPoint*) malloc(n * sizeof(missionPoint));

В этом нет необходимости, если вы хотите изменить только память, на которую указывает mission, но этого нельзя избежать, поскольку вы присваиваете новое значение самому указателю.

Также обратите внимание, что приведение к возвращаемому значению malloc необязательно в C.

1 голос
/ 15 июня 2011

Подумайте, что указатель в C - это просто целое число, хранящее некоторый адрес памяти. Подумайте, что malloc выделяет некоторую память и возвращает вам адрес этой памяти (новый указатель). Поймите, что этот фрагмент выведет «2», независимо от того, что вызванная функция делает с переданным значением.

int a = 2;
doSomething(a);
printf("%d\n",a);

Как только вы поймете все это, вы можете предсказать, что будет производить этот код, и почему вам нужно передать «ссылку на указатель» (указатель на указатель) вместо самого указателя (значение указателя) Ваша распределительная функция.

void remalloc(char * p1) {
     printf("pointer before remalloc (inside function): %X\n",(unsigned int)(p1));
     free(p1);
     p1 = (char*)malloc(200000);
     printf("pointer after remalloc (inside function): %X\n",(unsigned int)(p1));
}

int main(){
   char * p;
   printf("pointer before malloc: %X\n",(unsigned int)(p)); 
   p = (char*)malloc(10);
   printf("pointer after malloc: %X\n",(unsigned int)(p));
   remalloc(p);
   printf("pointer after remalloc: %X\n",(unsigned int)(p));
}
1 голос
/ 15 июня 2011

Передайте ссылку (то есть указатель) на указатель mission вместо значения самого указателя mission.Таким образом, объявление вашей функции будет выглядеть следующим образом:

void parseMission(missionPoint** pointer_ref);

, а не:

void parseMission(missionPoint* pointer_val);

, а затем передайте адрес mission (т.е. &mission) в качестве значения аргументадля parseMission.

...