为什么指向存储在.rodata中的字符串的指针,但指向int的指针在堆栈上?

时间:2014-12-14 04:51:13

标签: c assembly

我有以下与C语言相关的问题:

  1. 为什么char *p="Harish"存储在.rodata段?
  2. 为什么int *p=90存储在堆栈中?

2 个答案:

答案 0 :(得分:4)

执行此操作时:

char *p = "Harish";

您正在执行以下操作:

  1. 您正在堆栈上创建一个名为p
  2. 的指针
  3. 将其初始化为文字字符串"Harish"的地址。该字符串必须存储在函数退出时不会消失的地方,因此它存储在只读数据段中(它是一个常量字符串,因此它不需要是可写的)。
  4. 相比之下,当你这样做时:

    int *p = 90;
    

    你只是创建一个指针,但没有指向它的任何东西。您只是将指针设置为指向地址90。与上面的情况一样,指针位于堆栈中。没有任何内容进入.rodata段,因为声明不会创建任何指向它的内容。

答案 1 :(得分:0)

char *p="Harish" 

在上面的行中,“Harish”存储在共享的只读位置。但是指针p存储在读写存储器中。您可以将p更改为指向其他内容,但目前无法更改值p。所以这种字符串只应在我们不想在程序的后期修改字符串时使用。