【发布时间】:2013-05-24 16:05:41
【问题描述】:
据我所知#define 只是一个字符串替换,它不是一个变量,所以它没有任何内存地址或其他东西。
假设这段代码:
#include <stdio.h>
#define ONE "a"
main() {
printf("the number is: %d\n", ONE);
}
然后当我编译运行这个程序时,每次都会得到一个随机字符串:
号码是:8179551
号码是:21127007
号码是:57114463
...
如果#define 没有任何内存地址,那么这个值是多少,为什么每次都改变?
【问题讨论】:
-
您正在打印字符串的地址。 (尝试使用“a”而不是 ONE 来执行相同的 printf——你会得到相同的结果。)
-
答案的后半部分是你的系统使用en.wikipedia.org/wiki/Address_space_layout_randomization
-
您的程序通过使用
%d格式传递指向printf的指针来调用未定义的行为,因此您应该避免故意这样做。
标签: c c-preprocessor c-strings