2014-03-31 124 views
0

好的,所以问题基本上就像标题一样。找不到一个问题,它的所有位,所以我想我会问。分配结构数组中的指针

说我要结构的数组形如以下

typedef struct s_woo{ 
    char** n; 
    char* x; 
} t_woo; 

所以我相信我应该做

t_woo* woos = malloc(num_woos * sizeof(*woos)); 

看起来非常简单(而且应该从我喊我的习惯震慑人心铸造malloc)。

然后我想初始化每个结构中的东西。

所以我凭直觉做的:

for(i = 0; i < num_woos; i++){ 

    num_ns = randomint1/randomint2; //let's say num_ns is big, like 250-ish, average, and changes every round of the loop 

    woos[i].n = malloc(num_ns * sizeof(char*)); 
    woos[i].x = malloc(num_ns * sizeof(char)); 
    for(j = 0; j < num_ns; j++){ 
     woos[i].n[j] = malloc(16 * sizeof(char)); // I just want 16 characters per char* 
    } 
} 

这是什么,我有我的代码归结版本。我想知道我写的东西可能会出什么问题 - 就像任何可能的事情一样。我不特别寻找任何东西,只是一般问题与上述,如内存/堆问题,指针错误等。

抛出“虚拟内存用尽”。我的代码错误检查使用malloc上的包装函数,所以我非常确定不是这样。

+1

从这里看起来很好。这将有助于避免编码错误使用定义/常量而不是'16'。我不知道你是否打算在这些数组中存储字符串,但如果是这样,不要忘记null结束符。 –

+0

如果你打算进行健壮的设计,你可以使用更多*封装*,即把't_woo'变成一个独立的对象。这将涉及将'num_ns'放入't_woo'中,并且具有为单个't_woo'(以及另一个在后来销毁)完成所有构建的功能。然后,在你分配内存给它们之后,尽可能快地遍历你的't_woo'列表,在每个列表中调用构造函数。 –

+0

'并且每轮循环都会改变.. ..您是否在每次循环分配之前释放内存?也许你的外部循环运行很多次,它会产生内存错误。 –

回答

1

更妙的是:

static const size_t woo_n_size = 16; 
    /* To make sure you use 16 everywhere, 
    * also easier to change it 
    */ 

struct woo_item { 
    char n[woo_n_size]; 
    char x; 
}; 

struct s_woo { 
    struct woo_item *items; 
    size_t size;/* optinal, to keep track of item count */ 
} 

随着woo_item结构可以确保没有x没有分配n[woo_n_size],反之亦然。 您可以通过指定null元素来关闭每个列表来记住woo_items的数量,或者只需存储size成员s_woo