【问题标题】:The memory location of char array and string in cc中char数组和字符串的内存位置
【发布时间】:2020-06-15 01:32:10
【问题描述】:

字符串和字符数组存储在哪里?

int main ()
{
    int a = 0; //This should be stack
    char* p = "hello"; // why this is on the static?
    char k[10] = "hello"; //on the stack?
}

一本教科书上说char指针(Char* a)会存储在静态内存中,根据我对“静态内存”的理解,只有这2个会存储在静态内存中:

int a=0;// will on the static
int main()
{
    static xxxxx; //will on the static.
}

【问题讨论】:

  • 我认为,当您使用字符串文字初始化固定大小的数组时,它实际上是一种方便的语法,类似于使用花括号语法初始化其他类型的固定数组。但在其他情况下,字符串文字存在于静态内存中,您可以拥有指向它们的指针。它们在程序的持续时间内持续,因此您不必担心释放它们。
  • 能否请将名为 a 的变量之一更改为其他变量 int achar a[10]
  • 没有char* achar a[10] 是一个错误,因为 a 已经定义为 int

标签: c c-strings


【解决方案1】:

通过6.7.8.2char *p = "hello" 中的字符串"hello" 是字符串字面量。
字符串字面量一般位于.rodata,以防止修改。此外,全局变量位于.data 部分。

【讨论】:

  • 如果在类 Unix 上 @SadSalad 可以使用 objdump -s -j .rodata a.out(或真实程序名代替 a.out)来查看它。
  • 那么真正的字符串文字是否存储在静态内存中?
  • @SadSalad 是的。
【解决方案2】:

a 将在堆栈上。 p 本身将在堆栈中。但是,它指向的数据将位于内存的只读部分(而不是堆栈)中。

【讨论】:

  • 在任何情况下,“意志”都是“可能”,因为它像往常一样取决于编译器的突发奇想。不过,它们将是作用于该块的局部变量。
  • 只读部分=静态内存吗?或者他们之间有什么关系?
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2021-12-06
  • 1970-01-01
  • 2011-02-07
  • 2023-03-11
相关资源
最近更新 更多