2011-06-14 56 views
2

我想分配一个函数内的结构数组。函数内的动态结构数组分配

我的结构如下:

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需要,然后将下面的方式来分配它:

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

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

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

我将不胜感激您的帮助,使功能修改原来的指针,我可以看到功能外的数据。

+0

您应该对结构进行重新排序,以便它正确对齐。一个简单的方法就是按大小顺序排列成员。或者你可以在第一个两个之后将第三个'uint16_t'移动到右边,然后在这之后再移动两个'uint8_t'。 – 2011-06-14 22:15:49

回答

4

你需要传递给指针引用,即双指针,因为地址本身要进行修改:

missionPoint *mission; 
parseMission(&mission); 

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

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

这不会是必要的,如果你只是想修改mission所指向的内存,但它无法避免的,因为你是分配新值指针本身。

还要注意的是铸件的malloc返回值是没有必要在C.

+0

谢谢你的回答,它在功能之外被修改;现在如果在函数内我想修改数组的一部分,我会认为'(* mission [count])。taskNumber = 20'会修改它,但它只修改它在函数内,我将如何实现? – avivas 2011-06-15 12:25:23

+0

试着把这样的括号:'(* mission)[count] .taskNumber = 20' – 2011-06-15 12:32:38

+0

非常感谢;做到了! – avivas 2011-06-15 12:41:14

1

传递一个参考(即指针)的指针mission而非mission指针本身的值。所以,你的函数的声明看起来像:

void parseMission(missionPoint** pointer_ref); 

而不是:

void parseMission(missionPoint* pointer_val); 

再通mission(即&mission)作为parseMission参数值的地址。

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