我是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
答案 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
个字节。