#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
printf("a"+14);
printf("tera kya hoga kalia \n\n");
return 0;
}
//此代码打印
Hello world!
kalia
tera kya hoga kalia
//为什么要使用下一行的打印数据。
//是新来的C !!!
答案 0 :(得分:2)
该行:
printf("a"+14);
是等价的:
char const* s1 = "a";
char const* s2 = s1 + 14;
printf(s2);
表达式s1 + 14
计算为无效指针。鉴于s1
的值,只有s1+0
和s1+1
是有效的指针。
由于s2
是无效指针,因此行
printf(s2);
是未定义行为的原因。
事实上,鉴于s1
的值,只有计算s1+i
是所有i < 0
和i > 2
的未定义行为。
来自EOF的评论:
6.5.6加法运算符8 [...]如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。