0

我想在 C 中获取字符串常量的地址。

 char * const MYCONST = "StringString";

据我所知,常量被“保存”在内存的文本/代码段中。当我尝试获取 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 像语言环境变量时,谁能解释我。

谢谢!

4

6 回答 6

6

因为MYCONST已经是一个指针,所以你不需要一个&符号。您所需要的只是一个演员void*%p

printf("%p\n",(void*)MYCONST);

使用&符号,您打印MYCONST局部变量的地址(您也需要在void*那里进行转换,否则地址可能打印不正确),它确实位于堆栈上。

于 2013-10-12T11:25:23.390 回答
3
printf("%p\n",(void *) &MYCONST);

打印MYCONST指针变量的地址。

printf("%p\n", (void *) MYCONST);

打印MYCONST指针变量的值。

于 2013-10-12T11:25:45.817 回答
2

Q: //edit 到目前为止我找不到正确的答案:当我写的时候

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

但是它们应该有不同的地址,因为它们是不同的常数。


答: 因为两个指针都指向相同的字符串文字。编译器优化并让它们共享相同的数据,从而共享相同的地址。尝试编译你的代码

gcc program_name.c -O 

看看。您将看到不同的地址。

相对:两个指针的地址相同

于 2013-10-12T12:35:37.027 回答
1

C 字符串的第一个字符的地址在字符串本身的变量中,即在您的情况下为 MYCONST。

于 2013-10-12T11:25:14.280 回答
1
char * const MYCONST = "StringString";

初始化一个指针MYCONST,使其指向存储此字符串文字的内存。
要打印此字符串的地址,请使用指针的值:

printf("%p\n", (void*) MYCONST);   

代替

printf("%p\n", (void*) &MYCONST);

它打印指针本身的地址。

于 2013-10-12T11:26:04.603 回答
1
printf("%p\n",(void*)MYCONST);

将打印字符串MYCONST指向的第一个元素的地址。

&我之前没有放的原因MYCONST是因为MYCONST已经是一个指针。

如果你需要打印address of Pointer,那么你需要这样做&MYCONST

于 2013-10-12T11:29:38.673 回答