为什么显示两个数组而不是一个数组

时间:2019-04-25 10:40:37

标签: c arraylist

我是c的初学者。今天,当我编写一个c程序时,我发现了一些奇怪的东西。 我希望它显示的是sudo ln -s /Library/PostgreSQL/9.6/lib/libssl.1.0.0.dylib /usr/lib sudo ln -s /Library/PostgreSQL/9.6/lib/libcrypto.1.0.0.dylib /usr/lib ,但它显示的是abc。我想知道为什么这样显示。 代码是:

abcefg

答案不是#include <stdio.h> int main() { char a[3] = "abc"; char b[3] = "efg"; printf("%s", a); return 0; } 而是abc

2 个答案:

答案 0 :(得分:3)

C中的字符串以'\0'终止。 "abc"实际上是{ 'a', 'b', 'c', '\0' },即4 char秒。您的数组a仅可容纳3个char的空间,因此不会存储'\0'。当printf()尝试打印存储在a中的字符串时,它将一次读取并打印一个字符,直到遇到终止的'\0'为止,但是没有。因此,它将继续读取和打印。碰巧b就在内存中a的旁边,因此b的内容也被打印出来。

治愈:

#include <stdio.h>

int main(void)
{
    char a[4] = "abc";
    char b[4] = "efg";
    printf("%s", a);
}

,或者甚至更好的是,根本不为数组指定大小。让编译器根据初始化器"abc"找出正确的大小:

#include <stdio.h>

int main(void)
{
    char a[] = "abc";
    char b[] = "efg";
    printf("%s", a);
}

答案 1 :(得分:2)

char a[3] = "abc";丢失了0终止符的空间,因此printf将越界(未定义的行为)读入下一个内存位置,在该位置找到b数组(运气不错) )。

您应该使用char a[4] = "abc";char a[] = "abc";

当您不写数组大小时,编译器将从初始化中评估最小大小。

char b[3] = "efg";遇到了同样的问题,但是似乎很幸运,之后有一个0个字节。