为什么在C中如下面的代码中提到的警告线是采用下一行的字符串并打印?

时间:2016-04-01 01:55:29

标签: c printf

#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 !!!

1 个答案:

答案 0 :(得分:2)

该行:

printf("a"+14);

是等价的:

char const* s1 = "a";
char const* s2 = s1 + 14;
printf(s2);

表达式s1 + 14计算为无效指针。鉴于s1的值,只有s1+0s1+1是有效的指针。

由于s2是无效指针,因此行

printf(s2);

是未定义行为的原因。

事实上,鉴于s1的值,只有计算s1+i是所有i < 0i > 2的未定义行为。

来自EOF的评论:

  

6.5.6加法运算符8 [...]如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。