C 为什么这两个字符数组返回不同的结果?

C 为什么这两个字符数组返回不同的结果?,c,C,我只是给一个字符数组分配了一个ip,并将其打印出来,以确保它是正确的,并得到以下结果: int main(void) { char ip [11] = "65.55.57.27"; printf(ip); return 0; } 我明白了 但是如果我将数组大小增加到12 int main(void) { char ip [12] = "65.55.57.27"; printf(ip); return 0; } 我明白了 有人能解释一下吗?为什么

我只是给一个字符数组分配了一个ip,并将其打印出来,以确保它是正确的,并得到以下结果:

int
main(void)
{
    char ip [11] = "65.55.57.27";
    printf(ip);
    return 0;
}
我明白了

但是如果我将数组大小增加到12

int
main(void)
{
    char ip [12] = "65.55.57.27";
    printf(ip);
    return 0;
}
我明白了

有人能解释一下吗?为什么大小为11的数组返回13个字符的结果,而大小为12的数组返回11个字符的结果

char ip [11] = "65.55.57.27";
没有用于的空间,因为字符串文字长度正好为11个字符

这导致

printf(ip);

以下任一项都可以解决此问题:

char ip [12] = "65.55.57.27";
char ip [] = "65.55.57.27";
中的数组

char ip [11] = "65.55.57.27";
没有用于的空间,因为字符串文字长度正好为11个字符

这导致

printf(ip);

以下任一项都可以解决此问题:

char ip [12] = "65.55.57.27";
char ip [] = "65.55.57.27";

您为11个字节留出了空间,但您的字符数组中还存在隐式空字节
\0

>> ip

   {'6', '5', '.', '5', '5', '.', '5', '7', '.', '2', '7', '\0'}
因此,数组中有12个元素,1个元素的大小太多。你应该在你的编译器上得到一个错误。这就是我得到的:

错误:字符数组的初始值设定项字符串太长

我不喜欢处理这些琐碎的问题;这就是我为什么使用:

#包括
#包括
int main()
{
std::string str=“65.55.57.27”;

std::cout您为11个字节留出了空间,但您的字符数组中也存在隐式空字节
\0

>> ip

   {'6', '5', '.', '5', '5', '.', '5', '7', '.', '2', '7', '\0'}
因此,您的数组中有12个元素,1个元素的大小太多。您应该在编译器上得到一个错误。这是我得到的:

错误:字符数组的初始值设定项字符串太长

我不喜欢处理这些琐碎的问题;这就是为什么我使用:

#包括
#包括
int main()
{
std::string str=“65.55.57.27”;

std::请确定您真正感兴趣的语言。这不是C#。请确定您真正感兴趣的语言。这不是C#。只是为了补充这个答案。在任何好的C IDE中运行,这11个长度也会给出一个描述性错误。
字符数组的初始值设定项字符串太长。
@HankyPankyㇱ: 实际上,在这种特殊情况下,我不希望得到警告(当然,如果
ip
被声明为
char-ip[10]
,那就完全是另一回事了)@NPE为什么不呢?字符串有12个字符长。这是真的,但当我运行OP的代码时,我看到了那个警告,所以我想我会在这里添加它来补充您的错误answer@Aneri:我认为编译器有理由这样认为,如果我在显式指定数组的大小时遇到了麻烦,而它恰好与str的长度匹配这就是
gcc
的行为方式,我认为这是非常正确的。只是为了补充这个答案。在任何好的C IDE中运行,这11个长度也会给出一个描述性错误
字符数组的初始值设定项字符串太长
@HankyPankyㇱ: 实际上,在这种特殊情况下,我不希望得到警告(当然,如果
ip
被声明为
char-ip[10]
,那就完全是另一回事了)@NPE为什么不呢?字符串有12个字符长。这是真的,但当我运行OP的代码时,我看到了那个警告,所以我想我会在这里添加它来补充您的错误answer@Aneri:我认为编译器有理由这样认为,如果我在显式指定数组的大小时遇到了麻烦,而它恰好与str的长度匹配这就是
gcc
的行为方式,我认为这是正确的。