是否定义了此代码实现?

fuz*_*zzy 5 c pointers

#include<stdio.h>

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

  printf("%d%d",*((char*)ptr),*((char*)ptr+1));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*mes 8

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

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

if(*ptr) puts("Little Endian");
else puts("Big Endian");
Run Code Online (Sandbox Code Playgroud)

即使257 => 0x0101,int很可能是32位,在这种情况下,它将在BE机器上打印00,在LE上打印11.


pho*_*xis 2

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

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

在调用printf函数之前,将对参数进行求值。而上面所说的这种评估对于不同的系统会得到不同的值。因此它是由实现定义的。