需要一些帮助来理解奇怪的C行为

Mic*_*oka 2 c

这部分代码运行正常:

#include <stdio.h>

int main(){
    //char somestring[3] = "abc";
    int i, j; 
    int count = 5;

    for((i=0) && (j=0); count > 0; i++ && j++){
        printf("i = %d  and j = %d\n", i, j);
        count--;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出如预期:

i : 0 and j : 0
i : 1 and j : 1
i : 2 and j : 2
i : 3 and j : 3
i : 4 and j : 4
Run Code Online (Sandbox Code Playgroud)

当我在函数体的第一行取消注释char字符串声明时,事情变得奇怪了.

#include <stdio.h>

int main(){
    char somestring[3] = "abc";
    ...
}
Run Code Online (Sandbox Code Playgroud)

输出:

i : 0 and j : 4195392
i : 1 and j : 4195393
i : 2 and j : 4195394
i : 3 and j : 4195395
i : 4 and j : 4195396
Run Code Online (Sandbox Code Playgroud)

这背后的逻辑是什么?我在Ubuntu 9.10上使用gcc 4.4.1.

Ric*_*dle 18

j永远不会被初始化因为,短路行为的&&.由于(i=0)计算结果为false,(j=0)因此永远不会执行,因此j会获得随机值.在第一个例子中,恰好是零.

你应该说i=0, j=0要实现你想要的.

该i++ && j++有同样的问题; 它应该是i++, j++.

这个:

char somestring[3] = "abc";
Run Code Online (Sandbox Code Playgroud)

因为字符串中的尾随NUL字符,所以保留一个太少的字节 - 你需要四个字节.但是,如果您不打算修改字符串,则无需指定字节数 - 您可以这样说:

char *somestring = "abc";
Run Code Online (Sandbox Code Playgroud)

代替.