获取C中字符串常量的地址

时间:2013-10-12 11:23:30

标签: c string constants

我想在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,就像一个语言环境变量。

谢谢!

6 个答案:

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

看。你会看到不同的地址。

亲戚:Addresses of two pointers are same

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