String #define返回一个随机整数

时间:2013-05-24 16:05:42

标签: c c-preprocessor c-strings

据我所知#define只是一个字符串替换而且它不是变量,因此它没有任何内存地址或其他东西。

假设此代码:

#include <stdio.h>

#define ONE "a"

main() {
    printf("the number is: %d\n", ONE);
}

然后当我编译并运行这个程序时,我每次都得到一个随机字符串:

  

号码是:8179551

     

号码是:21127007

     

号码是:57114463

     

...

如果#define没有任何内存地址,那么这个值是什么以及每次更改的原因是什么?

3 个答案:

答案 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)

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

C99,7.19.6.1#9(fprintf)

  

如果转换规范无效,则行为为   undefined .239)如果任何参数不是正确的类型   相应的转换规范,行为未定义。

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

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