【问题标题】:How can I tell if a multi dimensional array has not been assigned to?如何判断是否未分配多维数组?
【发布时间】:2011-11-23 20:36:52
【问题描述】:

如果我有两个这样的数组:

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

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

我怎样才能知道 x 没有被赋值?

谢谢,

【问题讨论】:

  • xy 的大小在您的情况下将始终为 4,即使它们确实分配了内存,因为 sizeof 只返回其参数的大小,并且无论指针指向什么,指针的大小始终为4(在您的情况下)。
  • delnan - 未分配给
  • ... 在 C 中,没有办法知道指针指向多少东西,对吧?您还需要将存储中元素的数量作为元数据与指针一起传递。
  • @user940516 通常人们会给一个指针赋值NULL(即0)来表示它没有指向任何东西。你应该做short** x = NULL,然后检查你是否将它设置为指向任何东西,做if (x != NULL) // is assigned
  • @user940516:你应该编辑你的答案,让任何阅读问题的人都清楚。

标签: c multidimensional-array initialization


【解决方案1】:

从您原始帖子中的评论中,您的意思是您是否可以判断一个值是否已分配给变量。我们称之为初始化。当一个值没有被存储到一个变量时,它未初始化,这很糟糕,因为你永远不知道里面可能有什么,不,你不能检查它是否已经被初始化,所以初始化它当你声明它时。


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

【讨论】:

  • +1 用于澄清术语,在这个问题的范围之外非常有用。
【解决方案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;
}

【讨论】:

    【解决方案3】:

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

    解决方案?显式分配一个哨兵值并检查它。对于指针,NULL 通常是有意义的。

    【讨论】:

    • 看一个未赋值变量的值不就是UB吗?
    • @SethCarnegie:正如我所指出的,我不能 100% 确定。参考会很棒。也许这只是我的术语混淆?如果标准保证未初始化(本地,非static)变量的值,我会非常感到惊讶,但它可能不符合 UB 的确切定义。
    • 不,它绝对不能保证未初始化变量的值,但显然你是对的,根据stackoverflow.com/q/7468166/726361,它被称为 UB,这是由我信任的 Als 编写的,例如这个。我认为这将是实现定义的行为,但显然不是。 +1
    • @SethCarnegie:感谢您挖掘它。我冒昧地将它包含在我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2012-10-14
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多