2013-04-24 91 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,那么问题一定在别处。