2014-11-22 46 views
0

虽然我的数组只有大小3,并且我已经为每个元素指定了一个char,但仍然会自动添加NULL Terminator。是什么导致在我的代码中添加NULL Terminator?C - 为什么在将单个字符分配给数组时,会自动添加字符串终止符?

int main(void) 
{ 
    char s[3]; 
    s[0] = 'f'; 
    s[1] = 'o'; 
    s[2] = 'o'; 

    int i = 0; 

    while (s[i] != '\0') 
     printf("%c", s[i++]); 

    printf("\n"); 

    if (s[i] == '\0') 
     printf("Null Terminator Added\n"); 
} 
+4

这只是一个不错的行为。在你的数组后面会出现一个0 *,但那只是运气不好。 – 2014-11-22 19:21:29

+0

“什么导致NULL代码被添加到我的代码中” - 很可能是'i = 0'(尽管我期望它们之间有1个字节的间隔)。如果你想验证''i',你可以检查'&i',但是一般情况下,编译器会在's'之后立即分配'i'。这只是一个运气问题,至于在你的函数被调用的地方(在你的具体例子中它是'main',所以你应该在每次执行时都会得到相同的结果)执行时的堆栈内容。 – 2014-11-22 19:27:55

+0

如果你对C相对比较陌生,并且在数组和指针的工作方式方面存在问题,下面是一个帮助可视化差异的答案:http://stackoverflow.com/questions/27052988/what-is-the-difference-between -different-kinds-of-pointer-in-c/27054973#27054973 – technosaurus 2014-11-22 20:03:46

回答

3

它不是“自动添加”。当您尝试访问s[3]时,您正在访问不属于阵列s的内存。在你的机器上,看起来这个内存恰好包含一个空字节。你不能依赖这种事情发生;也许在另一台机器上,或另一次运行,该内存将碰巧包含其他内容。或者,也许电脑会检测到非法的内存访问,并且你的程序会崩溃。或者,也许你的程序会以一些其他微妙和意想不到的方式打破。

简短回答:你的程序是越野车,你不能真正从其行为中得出任何有意义的结论。

相关问题