如何判断是否尚未分配多维数组?

时间:2011-11-23 20:36:52

标签: c multidimensional-array initialization

如果我有两个阵列喜欢这个:

short** x;
short** y = functionThatReturnsAnArray();

在这种情况下sizeof(x) == sizeof(y)。 两者都是4,我相信这是因为外部数组只是一个指针数组,因此实际上并没有分配任何RAM。

如何找出x尚未分配值?

谢谢,

3 个答案:

答案 0 :(得分:2)

sizeof返回short**(指向short的指针)的大小,它在系统中似乎是4个字节。如果你分配内存,你应该知道你分配了多少字节,并且也传递了这个值。

例如:

size_t size_allocated = 0;
short** y = functionThatReturnsAnArray(&size_allocated);

short ** functionThatReturnsAnArray(size_t * size) {
    short ** buff;
    size_t size_to_allocate = 5 * sizeof(short *);
    buff = malloc(size_to_allocate);
    if (!buff) {
        *size = size_to_allocate;
    }
    else {
        *size = 0;
    }
    return buff;
}

答案 1 :(得分:2)

您无法检查是否已为其分配变量。未初始化变量的值是未定义的IIRC。根据{{​​3}}(由Seth Carnegie发现),即使访问它也会导致不确定的行为。

解决方案?明确指定一个标记值并检查它。对于指针,NULL通常是有道理的。

答案 2 :(得分:2)

根据原始帖子中的评论,您的意思是您是否可以判断某个值是否已分配给变量。我们称之为初始化。如果某个值尚未存储到变量中,那么它就是未初始化,这很糟糕,因为你永远不知道那里可能有什么,不,你不能检查它是否已被初始化,所以初始化它当你宣布它时。


sizeof(x) == sizeof(y)因为它们被声明为相同的类型(short**);它们的内容无关紧要(sizeof实际上是由编译器决定的,因此它通常无法知道其中的内容)。

如果你想知道每个指向的内存区域是否为零,你需要手动完成(你需要知道每个数组的长度):

int x_empty = 1;

for(int i = 0; i < x_length_d1 && x_empty; i++) {
    if(x[i] == NULL) {
        // Handle a missing row however you want.
    }
    for(int j = 0; j < x_length_d2 && x_empty; j++) {
        if(x[i][j] != 0) x_empty = 0;
    }
}