C 字符串#define返回一个随机整数

C 字符串#define返回一个随机整数,c,c-preprocessor,c-strings,C,C Preprocessor,C Strings,据我所知,define只是一个字符串替换,它不是一个变量,所以它没有任何内存地址之类的东西 假设此代码: #include <stdio.h> #define ONE "a" main() { printf("the number is: %d\n", ONE); } #包括 #定义一个“a” main(){ printf(“编号为:%d\n”,一个); } 然后,当我编译并运行此程序时,每次都会得到一个随机字符串: 电话号码是:8179551 电话号码是:21127

据我所知,define只是一个字符串替换,它不是一个变量,所以它没有任何内存地址之类的东西

假设此代码:

#include <stdio.h>

#define ONE "a"

main() {
    printf("the number is: %d\n", ONE);
}
#包括
#定义一个“a”
main(){
printf(“编号为:%d\n”,一个);
}
然后,当我编译并运行此程序时,每次都会得到一个随机字符串:

电话号码是:8179551

电话号码是:2112707

电话号码是:57114463

如果
#define
没有任何内存地址,那么这个值是什么?为什么每次都会更改

在您的代码中

printf("the number is: %d\n", ONE);
相当于

printf("the number is: %d\n", "a");
实际上,您正在将字符串
“a”
的地址打印为十进制

在每次执行中都会得到随机值,这是因为
“a”
的地址在每次执行中都是随机的


字符串
“a”
是一个文本字符串,它存储在只读存储器中。
printf
正在打印此内存的地址

穆罕默德是对的,您正在打印字符串的地址

你知道怎么做吗

#define ONE 'a'

两个
之间的所有内容都是字符,只允许一个字符

此程序调用未定义的行为,因为格式规范与参数类型不匹配(
int
char*

C99,7.19.6.1#9(fprintf)

如果转换规范无效,则行为无效 未定义。239)如果任何参数不是 对应的转换规范,行为未定义

打印地址的正确方法是使用
%p
并通过
(void*)
参数:

printf("the address is: %p\n", (void *)ONE);

那每次都要换吗?您所说的打印字符串地址是什么意思?@AfshinMehrabani字符串“a”是一个文本字符串,它存储在只读存储器中。printf正在打印此MemoryStrage的地址。我不知道字符串也存储在内存中!对不起,我是新手。@AfshinMehrabani你想做什么?@MOHAMED不复杂,我只是想知道
#define
C
中常量之间的区别,所以我写了这段代码来看看。谢谢你,伙计。你正在打印字符串的地址。(用“a”而不是“1”来尝试相同的printf——你会得到相同的结果。)答案的后半部分是系统正在使用,并且你的程序通过传递一个指向
printf
的指针(使用
%d
格式)来调用未定义的行为,因此你应该避免故意这样做。