2013-04-24 96 views
0

比方說,我有一個名爲「富」結構和裏面我有一個指針在C的結構內包裹着指針的二維數組分配內存

 typedef struct Foo { 
      Stuff* (*stuff)[16]; 
     } Foo; 

的二維數組我有一個initializeFoo功能像這樣,對於整個對象

 void initializeFoo(Foo **foo) { 
      *foo = (Foo*)malloc(sizeof(Foo)); 
     } 

分配內存然而,只是我導致分段故障(核心轉儲)上運行我的程序 我在想,我需要分配的內存*的東西時,但我該怎麼做?我會堅持在initializeFoo函數?

我的猜測是使用:

(*foo)->stuff = (Stuff*(*)[16])malloc(sizeof(Stuff)) 

有人能幫助我嗎?

回答

2

是的,你需要爲stuff分配內存。此外,你現在擁有的實際上是一個三維「陣列」。

您也沒有爲stuff分配足夠的內存。

它實際上可能是簡單,只需使用指針到指針來模擬二維數組:

typedef struct Foo { 
    Stuff **stuff; 
} Foo; 

然後在initializeFoo

void initializeFoo(Foo **foo) 
{ 
    *foo = malloc(sizeof(Foo)); 

    /* Allocate first dimension, 32 items */ 
    (*foo)->stuff = malloc(sizeof(Stuff *) * 32); 

    /* Allocate second dimension, 16 items each */ 
    for (int i = 0; i < 32; i++) 
     (*foo)->stuff[i] = malloc(sizeof(Stuff) * 16); 
} 
1

說句肯定的,我會需要查看所有代碼,但我的猜測是,您傳遞給initializeFoo的雙指針本身並未分配。

例如,如果你這樣做:

Foo ** foo; 
initializeFoo(foo); 

你的程序將段錯誤,因爲你提領富,尚未分配。但是,如果你使用:

Foo * foo; 
initializeFoo(&foo); 

Foo ** foo = (Foo **)malloc(sizeof(Foo *)); 
initializeFoo(foo); 

和程序仍然出現segfaults,那麼問題一定在別處。