栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

GCC将字符串常量存储在哪里以及这些指针从何处映射?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

GCC将字符串常量存储在哪里以及这些指针从何处映射?

在这两种情况下,编译器在程序部分

"hello"
仅发出一次字符串的实际字节
.rodata
rodata 代表 只读数据 )。

它们实际上是直接从可执行文件映射到内存的,有点类似于代码部分。这就是为什么它们与动态分配的相距甚远的原因。

然后:

char *p = "hello";

只需将其初始化

p
为该(只读)数据的地址。显然:

char *q = "hello";

获取完全相同的地址。这称为 字符串池 ,是编译器的可选流行优化。

但是当你写:

char p[] = "hello";

它可能会生成如下内容:

char p[6];memcpy(p, "hello", 6);

作为

"hello"
只读汇集字符串的实际地址。

的调用

memcpy
仅出于说明目的。最好直接内联复制,而不是使用函数调用。

如果以后再做:

char q[] = "hello";

它将定义另一个数组和另一个数组

memcpy()
。因此,相同的数据,但不同的地址。

但是这些数组变量将驻留在哪里?好吧,这取决于。

  • 如果它们是局部的,非静态的变量:在堆栈中。
  • 如果它们是全局变量:那么它们将位于
    .data
    可执行文件的部分中,并且将在其中保存有正确的字符,因此
    memcpy
    在运行时不需要。很好,因为
    memcpy
    必须在之前执行
    main
  • 如果它们是局部静态变量:与全局变量完全相同。他们俩都被称为
    variables of static duration
    或类似的东西。

关于文档链接,对不起,我一无所知。

但是,如果您可以自己进行实验,谁需要文档?为此,最好的工具是

objdump
,它可以反汇编程序,转储数据节等等!

我希望这能回答您的问题…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号