2011-06-14 96 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)); 
}