添加到指针时出现意外结果

时间:2009-12-15 20:50:24

标签: c undefined-behavior

有人告诉我这段代码打印出29.为什么会这样?

int *a = 17; 
printf("%d", a+3);

5 个答案:

答案 0 :(得分:36)

因为当您添加到指针时,它会添加对象大小。在这种情况下,对象大小为4(sizeof(int)== 4) - 所以17 + 3 * 4 == 29.

答案 1 :(得分:13)

每个人都知道答案是23,至少在6809上。

a+3 == a + (3 * sizeof(int)) == a + 6 == 17 + 6 == 23

答案 2 :(得分:11)

a+3 == a + (3 * sizeof(int)) == a + 12 == 17 + 12 == 29

答案 3 :(得分:2)

在C语言中,指针不能用积分值初始化,唯一的例外是积分常数表达式,其值为整数零。 17不符合该要求。

您的代码无效。它不会“打印”任何东西。这个问题没有任何意义。从指针算术的角度来分析这个问题的任何尝试都是荒谬的,只是浪费时间。


ISO / IEC 9899:1999(Progamming Languages - C)

  

6.5.16.1简单分配

     

约束

     

以下其中一项应成立: 93)

     

- 左操作数具有限定或非限定算术类型,右边具有   算术类型;

     

- 左操作数具有结构或联合类型的限定或非限定版本   兼容权利的类型;

     

- 两个操作数都是指向兼容类型的限定或非限定版本的指针,   并且左边指向的类型具有指向的类型的所有限定符   权;

     

- 一个操作数是指向对象或不完整类型的指针,另一个是指向a的指针   void的限定或不合格版本,左边指向的类型全部   右边指出的类型的限定符;

     

- 左操作数是指针,右边是空指针常量;或

     

- 左操作数的类型为_Bool,右侧是指针。

     

93)这些约束对于类型限定符的不对称外观是由于转换   (在6.3.2.1中指定)将lvalues更改为''删除任何类型的表达式''的值   表达式类型类别中的限定符。

答案 4 :(得分:-2)

可以打印任何内容..您正在设置指向内存中位置“17”的指针...

相关问题