据我所知#define
只是一个字符串替换而且它不是变量,因此它没有任何内存地址或其他东西。
假设此代码:
#include <stdio.h>
#define ONE "a"
main() {
printf("the number is: %d\n", ONE);
}
然后当我编译并运行这个程序时,我每次都得到一个随机字符串:
号码是:8179551
号码是:21127007
号码是:57114463
...
如果#define
没有任何内存地址,那么这个值是什么以及每次更改的原因是什么?
答案 0 :(得分:3)
在您的代码中
printf("the number is: %d\n", ONE);
相当于
printf("the number is: %d\n", "a");
实际上,您将字符串"a"
的地址打印为小数。
并且每次执行都会得到随机值,因为"a"
的地址在每次执行中都有随机地址
字符串"a"
是一个文字字符串,它存储在只读存储器中。 printf
正在打印此内存的地址
答案 1 :(得分:1)
MOHAMED是对的,你打印字符串的地址
你该怎么做
#define ONE 'a'
两个'
之间的所有内容都是字符,只允许一个字符
答案 2 :(得分:0)
此程序调用未定义的行为,因为格式规范与参数类型(int
与char *
)不匹配。
C99,7.19.6.1#9(fprintf)
如果转换规范无效,则行为为 undefined .239)如果任何参数不是正确的类型 相应的转换规范,行为未定义。
打印地址的正确方法是使用%p
并通过(void *)
参数:
printf("the address is: %p\n", (void *)ONE);