我在intel机器上使用64位gcc编译器来编译以下代码
void main(void) {
unsigned long L = 1, R = "123";
printf("%s %lu %lu", "1st",L, R);
printf("%s %d %s", "2nd", L, R);
}
我得到以下输出
1,1,5205913
第2,1,123
我的困惑是当我拿%Lu时这个号码是4205913,而当我拿%s" 123"打印得当。
答案 0 :(得分:2)
正确打印123
的原因是巧合:在您的架构中,地址可以适合unsigned long
。这绝不是一种保证,所以你看到的是未定义的行为,只是简单地按照你自己的方式行事"。
该标准定义了一个保证能够保持指针的整数类型uintptr_t
。通过适当的转换使用此类型可以将指针存储在非指针变量中,并避免未定义的行为。