-2

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

假设这段代码:

#include <stdio.h>

#define ONE "a"

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

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

号码是:8179551

号码是:21127007

号码是:57114463

...

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

4

3 回答 3

3

在您的代码中

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

相当于

printf("the number is: %d\n", "a");

实际上,您将字符串的地址打印"a"为十进制。

而且您在每次执行中都会获得随机值,这是因为在每次执行中的地址"a"都是随机地址

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

于 2013-05-24T16:07:03.863 回答
1

MOHAMED 是对的,你打印了一个字符串的地址

你做什么

#define ONE 'a'

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

于 2013-05-24T16:10:41.010 回答
0

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

C99, 7.19.6.1 # 9 (fprintf)

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

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

printf("the address is: %p\n", (void *)ONE);
于 2013-05-24T18:01:00.533 回答