2011-11-23 70 views
0

如果我有两个数组喜欢这样的:如何判断多维数组是否未分配给?

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

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

我如何知道x没有被赋值?

谢谢,

+3

定义“空”。 – delnan

+0

在你的情况下,'x'和'y'的大小将始终为'4',即使它们有分配给它们的内存,因为sizeof'只返回其参数的大小,并且指针的大小始终'4'(在你的情况下),无论它指向什么。 –

+0

delnan - 未分配给 – JoeS

回答

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; 
    } 
} 
+0

+1用于澄清术语,超出此问题的范围非常有用。 – delnan

2

sizeof返回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; 
} 
2

不能检查,如果一个变量已被分配到。未初始化的变量的值是未定义的IIRC。根据Assigning pointer to uninitialized variable changes it value?(由Seth Carnegie发现),即使访问它也会导致未定义的行为。

解决方案?显式指定一个标记值并检查它。对于指针来说,NULL通常是有意义的。

+0

看一个未分配变量的值不是UB吗? –

+0

@SethCarnegie:正如我所指出的,我不是100%确定的。参考将是很好的。也许这只是我的一个混淆术语?如果标准保证了未初始化(local,non-'static)变量的值,但是它可能不符合UB的确切定义,我会非常惊讶。 – delnan

+1

不,它绝对不能保证未初始化变量的值,但显然你是对的,它被称为UB根据http://stackoverflow.com/q/7468166/726361,这是由我信任的Als写的关于这样的事情。我认为这将是实现定义的行为,但显然不是。 +1 –