【问题标题】:how to test if a variable is valid or whether it is initialized or not in C?如何测试变量是否有效或在 C 中是否已初始化?
【发布时间】:2022-07-05 13:53:12
【问题描述】:

我正在哈佛的 cs50 课程中从零开始学习 C。 我得到了一个以这种方式初始化的数组:

int stuff[9][9];

现在我必须处理它。
我想检查数组的每一项是否存在:如果不存在,则为stuff[i][j] = 0,否则为stuff[i][j]++
但是我在搜索时没有找到如何检查我正在操作的变量是否存在或有效或其他的结果:没有!!stuff[i][j],也没有一些typeof stuff[i][j] 或比较if (stuff[i][j] == 'undefined')NULL 或任何变体我可以使用...
那么,如何检查声明的变量是否还没有被初始化呢?


更新
我已经对此进行了测试:

int a[3];
for(int i = 0; i < 3; i++)
{
    a[i] = a[i] || 0;
}

for(int i = 0; i < 3; i++)
{
    printf("a[%i] -> %i\n", i, a[i]);
}

所以,如果a[i] 不存在(即没有分配给它的值),它将收到值0。 这是printf 的输出:

a[0] -> 1
a[1] -> 1
a[2] -> 0

这很好,因为这种方法没有引发错误,但是……这些数字是多少??

【问题讨论】:

    标签: c variables data-structures initialization cs50


    【解决方案1】:

    假设上面的数组是一个局部变量而不是全局变量,那么数组的值是未初始化的,实际上你不能检查一个变量是否未初始化与否,因为简单地尝试读取这样的变量可能会触发undefined behavior

    听起来您希望所有数组元素都以值 0 开头。最简单的方法是这样初始化数组:

    int stuff[9][9] = {{ 0 }};
    

    将元素[0][0] 显式设置为0,并将所有其他元素隐式设置为0。

    或者,您可以创建一个循环,将所有值设置为 0,然后再进行“常规”处理。

    【讨论】:

    • 很高兴知道...但是假设这是一个全局变量,是否有解决方法?
    • 如果它是全局的并且没有显式初始化,那么它被隐式初始化为所有值 0。
    • 其实,你是对的......我的错误出现在代码 kkk 的另一部分。但是我从您之前的回答中了解到如何使所有项目初始化为相同的值。
    • @AtauãDoederlein — 在当前版本的 C 中,您只能将所有项目设为零(或将某些项目明确列为非零,而将其他所有项目设为零)。 GCC 有一个扩展,允许您重复非零初始化器,但它不是标准的。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2016-10-03
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2013-09-20
    相关资源
    最近更新 更多