数组初始化

Sim*_*mon 3 c++

我试图在for循环的条件内分配数组内的值:

#include <iostream>
using namespace std;
int* c;
int n;
int main()
{
    scanf("%d", &n);
    c = new int[n];
    for (int i = 0; i < n; c[i] = i++  )
    {
        printf("%d \n", c[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,我没有得到所需的输出,因为n = 5 , 0 1 2 3 4. 相反,如果我正在使用该指令c[i] = ++i,我将获得输出-842150451 1 2 3 4.能否请您解释一下我们的代码是否像这样,我该如何纠正?

Ste*_*sop 8

表达式++i的值是增加 的值i.因此,如果它从0开始,则第一次分配值1,依此类推.你可以看到其中的价值得到了分配,但问为什么它得到分配有打开一罐蠕虫.

i在表达式中使用,其中i通过i++ ++i未定义的行为进行修改,除非在两者之间存在所谓的"序列点".在这种情况下,没有.请参阅该语言相当复杂的部分的未定义行为和序列点.

尽管标准未对行为进行定义,但从一次运行到另一次运行可能不一致,显然您的程序已经完成了某些操作.显然它根本没有分配给索引0(至少,不是在第一次打印之前,考虑到循环体在"for"的最后一部分之前发生,这是可以理解的)所以你得到的任何事情都恰好是在分配给你的原始内存中.它分配1给索引1等.

这意味着它也可能试图赋值5c[5],这是一类错误的称为"缓冲区溢出",以及在什么你已经得到了顶尖的更多不确定的行为.尝试分配它可能会覆盖其他内存,在任何一天可能包含或不包含重要内容.

修复是分配一些值c[0],并且不尝试分配c[5],但不管怎样,并且不要尝试无效地使用i"同时"递增它.通常你会写这个:

for (int i = 0; i < n; ++i) {
    c[i] = i;
    printf("%d \n", c[i];
}
Run Code Online (Sandbox Code Playgroud)

如果你因为某种原因迫切需要在for循环的第三个子句中进行赋值,你可以使用逗号运算符来引入一个序列点:

for (int i = 0; i < n; c[i] = i, ++i) {
}
Run Code Online (Sandbox Code Playgroud)

但是当然如果你这样做那么你就无法打印c[i]循环体中的值.它尚未分配,因为直到每个循环结束才会评估第三个子句.

您也可以尝试c[i] = i+1, ++i,但不是 ++i, c[i] = i因为我们在c[5]最后一次迭代时又回到尝试分配.