在C中动态分配char **

时间:2012-08-09 12:58:51

标签: c dynamic-memory-allocation

我的日期类型定义为 typedef char * DateTime; 格式为“dd / mm / yyyy-hh:mm”,例如“08/08 / 2012-12:00”

我想分配n个字符串,即“dates”。 以下是什么问题?

    DateTime*  dates = (DateTime* ) malloc(sizeof(char*) * n);  
for (int i = 0; i <= n; i++) {
    dates[i] =  malloc(sizeof(char)*16);
    if (dates[i] == NULL) {
        free(dates);

        return NULL;
    }
}

4 个答案:

答案 0 :(得分:7)

for (int i = 0; i <= n; i++) {
                   ^

在C数组中,从0开始,因此无法访问dates[n]。放下=

答案 1 :(得分:3)

除了@Dan和@cnicutar的回复(两者都是现货),请注意字符串文字“08/08 / 2012-12:00”包含 17 字符(不是 16 )。虽然它的字符串长度为16,但它包含您看到的16个字符,在结尾处加上'\ 0'字符作为终结符。而且,sizeof(char)是一个定义。最后,使用malloc分配内存的惯用方法是 -

DateTime *dates = malloc(n * sizeof *dates);

答案 2 :(得分:2)

除了cnicutar的回答,还有这个:

如果这种情况属实:

if ( dates[i] == NULL )

你只是在整个数组上调用free,而不是释放数组中i之前的元素。这可能会导致严重的内存泄漏

答案 3 :(得分:0)

正如我所指出的那样,我在评论中,以及其他人,循环

for (int i = 0; i <= n; i++) {

循环一次到多次。

另一个问题是:

dates[i] =  malloc(sizeof(char)*16);

实际字符串是16个字符,但由于C中的字符串需要额外的终结符('\0'),因此需要再分配一个字符,这意味着您应该乘以17。

正如Dan F所指出的,你也有潜在的内存泄漏。

两个最大的问题是循环和分配,因为在覆盖未分配的内存时会导致所谓的未定义行为