【问题标题】:Get address of a string-constant in C获取C中字符串常量的地址
【发布时间】:2013-10-12 11:23:29
【问题描述】:

我想获取 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 时,谁能解释我。

谢谢!

【问题讨论】:

    标签: c string constants


    【解决方案1】:

    由于MYCONST 已经是一个指针,你不需要一个&符号。您只需将%p 转换为void*

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

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

    【讨论】:

      【解决方案2】:
      printf("%p\n",(void *) &MYCONST);
      

      打印MYCONST 指针变量的地址。

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

      打印MYCONST 指针变量的值。

      【讨论】:

      • 当我尝试获取指针值的地址时:0x7fff70f54bb8。我认为这不正确,因为常量在代码段中并且该地址属于堆栈?
      【解决方案3】:

      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
      

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


      A: 因为两个指针都指向同一个字符串字面量。编译器优化并让它们共享相同的数据,从而共享相同的地址。尝试使用

      编译您的代码
      gcc program_name.c -O 
      

      然后看看。您会看到不同的地址。

      亲戚:Addresses of two pointers are same

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:
          char * const MYCONST = "StringString";
          

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

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

          而不是

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

          打印指针本身的地址。

          【讨论】:

            【解决方案6】:
            printf("%p\n",(void*)MYCONST);
            

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

            我之所以没有把&放在MYCONST之前是因为MYCONST已经是一个指针了。

            如果你需要打印address of Pointer,那么你需要像&MYCONST一样。

            【讨论】:

            • 没有。它不会打印MYCONST的地址。它将打印字符串的第一个字符的地址。
            • @hacks 是的,我进行了更正。这是一个错字。我试图快速回答,但其他人比我快:P
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多