被C String困惑

时间:2016-07-18 01:19:48

标签: c string strcpy

在学习C String时,我有这段代码:`

char s[1];
strcpy(s, "hello");
puts(s);
printf("sizeof(s) = %ld\n", sizeof(s));//the result is 1
printf("strlen(s) = %ld\n", strlen(s));//the result is 5
printf("s[4] = %c\n", s[4]);//print 'o'

为什么这段代码片段会出现这种奇怪的结果?我的意思是我可以合法地将长度为5的字符串分配给声明为大小为1的字符串。

1 个答案:

答案 0 :(得分:0)

  

我的意思是我可以合法地将长度为5的字符串分配给以大小为1声明的字符串。

不,你不能。您已经写过缓冲区的末尾,它调用未定义的行为。代码是错误的,但语言标准对编译器没有要求以任何特定方式处理这种情况。结果可以是从立即崩溃到乱码输出到完全按预期工作的任何事情。这一切都取决于记忆中s之后的内容。

C对数组访问没有边界检查;该语言假设您足够聪明,不能访问数组边界之外的元素。如果您读取或写入数组末尾,则不会抛出异常。只要你没有破坏任何重要,你的代码就会正常运行。