我想在C中获取字符串常量的地址。
char * const MYCONST = "StringString";
据我所知,consts被“保存”在内存的文本/代码段中。 当我试图获取MYCONSt中第一个元素的地址时:
printf("%p\n",&(MYCONST));
结果我得到0x7fff15342e28,它位于堆栈中,而不是文本/代码段。 有人可以帮我在C中获取字符串常量的地址吗?
//编辑 到目前为止我找不到正确答案:当我写
时 char * const MYCONST1 = "StringString";
printf("Address of MYCONST1: %p\n",MYCONST1);
char * const MYCONST2 = "StringString";
printf("Address of MYCONST2: %p\n",(void*)MYCONST2);
这是输出:
MYCONST1的地址:0x400b91
MYCONST2的地址:0x400b91
但它们应该有不同的地址,因为它们是不同的常量。 任何人都可以解释我,结果的长度为7,而不是0x7fffa5dd398c,就像一个语言环境变量。
谢谢!
答案 0 :(得分:5)
由于MYCONST
已经是指针,因此您不需要&符号。您只需要为void*
投射到%p
:
printf("%p\n",(void*)MYCONST);
使用&符号,您打印MYCONST
局部变量的地址(您还需要void*
转换,否则地址可能打印不正确),这确实位于堆栈上。
答案 1 :(得分:3)
printf("%p\n",(void *) &MYCONST);
打印MYCONST
指针变量的地址。
printf("%p\n", (void *) MYCONST);
打印MYCONST
指针变量的值。
答案 2 :(得分:2)
问: //编辑到目前为止我找不到正确的答案:我写的时候
char * const MYCONST1 = "StringString";
printf("Address of MYCONST1: %p\n",MYCONST1);
char * const MYCONST2 = "StringString";
printf("Address of MYCONST2: %p\n",(void*)MYCONST2);
这是输出:
Address of MYCONST1: 0x400b91
Address of MYCONST2: 0x400b91
但它们应该有不同的地址,因为它们是不同的常量。
A:由于两个指针都指向同一个字符串文字。编译器优化并让它们共享相同的数据,因此共享相同的地址。尝试使用
编译代码gcc program_name.c -O
看。你会看到不同的地址。
答案 3 :(得分:1)
C字符串的第一个字符的地址位于字符串本身的变量中,即您的情况下为MYCONST。
答案 4 :(得分:1)
char * const MYCONST = "StringString";
初始化指针MYCONST
,使其指向存储此字符串文字的内存
要打印此字符串的地址,请使用指针的值:
printf("%p\n", (void*) MYCONST);
而不是
printf("%p\n", (void*) &MYCONST);
打印指针本身的地址。
答案 5 :(得分:1)
printf("%p\n",(void*)MYCONST);
将打印字符串MYCONST
的第一个元素的地址指向。
我没有在&
之前放置MYCONST
的原因是因为MYCONST
已经是指针。
如果您需要打印address of Pointer
,则需要执行&MYCONST
。