C-为数组分配单个字符时,为什么会自动添加字符串终止符?

C-为数组分配单个字符时,为什么会自动添加字符串终止符?,c,arrays,null,char,terminator,C,Arrays,Null,Char,Terminator,虽然我的数组大小只有3,并且我为每个元素分配了一个字符,但仍然会自动添加一个空终止符。是什么导致在我的代码中添加空终止符 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] == '

虽然我的数组大小只有3,并且我为每个元素分配了一个字符,但仍然会自动添加一个空终止符。是什么导致在我的代码中添加空终止符

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");
}   
它不是“自动添加的”。当您尝试访问
s[3]
时,您正在访问不属于数组
s
的内存。在您的计算机上,该内存似乎恰好包含一个空字节。你不能指望那会发生;也许在另一台机器上,或者在另一次运行中,该内存将碰巧包含其他内容。或者,计算机可能会检测到非法内存访问,您的程序将崩溃。或者,您的程序可能会以其他微妙和意外的方式中断

简短回答:您的程序有缺陷,您无法从其行为中得出任何有意义的结论。

它不是“自动添加的”。当您尝试访问
s[3]
时,您正在访问不属于数组
s
的内存。在您的计算机上,该内存似乎恰好包含一个空字节。你不能指望那会发生;也许在另一台机器上,或者在另一次运行中,该内存将碰巧包含其他内容。或者,计算机可能会检测到非法内存访问,您的程序将崩溃。或者,您的程序可能会以其他微妙和意外的方式中断

简短回答:您的程序有缺陷,您无法从其行为中得出任何有意义的结论。

它不是“自动添加的”。当您尝试访问
s[3]
时,您正在访问不属于数组
s
的内存。在您的计算机上,该内存似乎恰好包含一个空字节。你不能指望那会发生;也许在另一台机器上,或者在另一次运行中,该内存将碰巧包含其他内容。或者,计算机可能会检测到非法内存访问,您的程序将崩溃。或者,您的程序可能会以其他微妙和意外的方式中断

简短回答:您的程序有缺陷,您无法从其行为中得出任何有意义的结论。

它不是“自动添加的”。当您尝试访问
s[3]
时,您正在访问不属于数组
s
的内存。在您的计算机上,该内存似乎恰好包含一个空字节。你不能指望那会发生;也许在另一台机器上,或者在另一次运行中,该内存将碰巧包含其他内容。或者,计算机可能会检测到非法内存访问,您的程序将崩溃。或者,您的程序可能会以其他微妙和意外的方式中断


简短回答:你的程序有缺陷,你不能从它的行为中得出任何有意义的结论。

这只是一个好的未定义的行为。数组后面正好有一个0,但这只是运气不好。“是什么导致我的代码中添加了一个空终止符”-很可能是
i=0
(尽管我希望它们之间有1个字节的间隙)。如果要验证这一点,可以检查
&i
,但通常语言不能保证编译器会在
s
之后立即分配
i
。这只是运气的问题,对于调用函数的执行点的堆栈内容(在您的特定示例中,它是
main
,因此每次执行时都应该期望相同的结果)。如果您对C比较陌生,并且对数组和指针的工作方式有问题,下面是一个有助于将差异形象化的答案:感谢所有有用的反馈。经过进一步的测试,我得出了同样的结论。“/0”恰好位于堆栈的未定义的s[3]内存位置。
NULL
是(扩展为)NULL指针常量的宏。不要使用术语“NULL”来指代NULL字符。这只是一种良好的未定义行为。数组后面正好有一个0,但这只是运气不好。“是什么导致我的代码中添加了一个空终止符”-很可能是
i=0
(尽管我希望它们之间有1个字节的间隙)。如果要验证这一点,可以检查
&i
,但通常语言不能保证编译器会在
s
之后立即分配
i
。这只是运气的问题,对于调用函数的执行点的堆栈内容(在您的特定示例中,它是
main
,因此每次执行时都应该期望相同的结果)。如果您对C比较陌生,并且对数组和指针的工作方式有问题,下面是一个有助于将差异形象化的答案:感谢所有有用的反馈。经过进一步的测试,我得出了同样的结论。“/0”恰好位于堆栈的未定义的s[3]内存位置。
NULL
是(扩展为)NULL指针常量的宏。不要使用术语“NULL”来指代NULL字符。这只是一种良好的未定义行为。数组后面正好有一个0,但这只是运气不好。“是什么导致我的代码中添加了一个空终止符”-很可能是
i=0
(尽管我希望它们之间有1个字节的间隙)。如果要验证这一点,可以检查
&i
,但通常语言不能保证编译器会在
s
之后立即分配
i
。这只是运气的问题,对于调用函数的执行点的堆栈内容(在您的特定示例中,它是
main
,因此每次执行时都应该期望相同的结果)。如果您对C比较陌生,并且对数组和指针的工作方式有问题,下面是一个有助于将差异形象化的答案:感谢所有有用的反馈。再过几天