如果我有两个阵列喜欢这个:
short** x;
short** y = functionThatReturnsAnArray();
在这种情况下sizeof(x) == sizeof(y)
。
两者都是4,我相信这是因为外部数组只是一个指针数组,因此实际上并没有分配任何RAM。
如何找出x尚未分配值?
谢谢,
乔
答案 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;
}
}