是否定义了此代码实现?

时间:2012-09-12 04:49:53

标签: c pointers

#include<stdio.h>

int main (void)
{
  int i=257;
  int *ptr=&i;

  printf("%d%d",*((char*)ptr),*((char*)ptr+1));
  return 0;
}

上面的代码实现的输出是否会定义,输出会在little endian和big endian机器之间有所不同?

3 个答案:

答案 0 :(得分:8)

是。在运行时检测字节序的经典方法是以下方式:

uint32_t var = 1;
uint8_t *ptr = (uint8_t*)&var;

if(*ptr) puts("Little Endian");
else puts("Big Endian");

即使257 =&gt; 0x0101,一个int很可能是32位,在这种情况下,它将在BE机器上打印00,在LE上打印,11。

答案 1 :(得分:3)

是的,它会。 我总是这样写,因为我从不确定运算符优先级:

*(((char*)ptr)+1)

要实现您的目标,请将格式字符串中的%d更改为%c

答案 2 :(得分:2)

是的,它将是实现定义的行为。

当您使用ptr转换(char *)然后访问第一个内存位置时,将访问存储在内存中的第一个字节,这取决于系统是大端还是小 - 结束系统。

在调用printf函数之前,将评估参数。如上所述的这种评估将为不同的系统获得不同的值。因此它是实现定义的。