函数内的动态结构数组分配

时间:2011-06-14 20:19:53

标签: c multithreading dynamic

我正在尝试在函数中分配一个结构数组。

我的结构如下:

 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-pointer,然后我将其传递给函数,该函数将在解析文件并计算出需要的大小后动态分配它。 目前这是我的代码的样子:

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

然后parseMission函数将解析一个特定的文件并找出我需要多少个missionPoints,然后按以下方式分配它:

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

其中n是我需要解析的任务数量。

问题是在函数中我可以看到正确的值,但不能在它之外;一旦函数返回它就像没有发生任何事情。

我很感激你的帮助,使函数修改原始指针,我可以看到函数外部的数据。

3 个答案:

答案 0 :(得分:4)

您需要传递对指针的引用,即双指针,因为地址本身将被修改:

missionPoint *mission;
parseMission(&mission);

parseMission的论点现在应该是missionPoint **而不是missionPoint *

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

如果您只想修改mission所指向的内存,则无需这样做,但由于您要为指针本身分配新值,因此无法避免。

另请注意,在C中无需转换malloc的返回值。

答案 1 :(得分:1)

将引用(即指针)传递给mission指针,而不是mission指针本身的值。所以你的函数声明如下:

void parseMission(missionPoint** pointer_ref);

而不是:

void parseMission(missionPoint* pointer_val);

然后将mission的地址(即&mission)作为parseMission的参数值传递。

答案 2 :(得分:1)

认为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));
}