字符串文字的地址长度

2024-01-03

我发现在带有 GCC 的 Linux 系统上,字符串文字的地址似乎比其他变量小得多。例如,以下代码生成下面所示的 o/p。

#include <stdio.h>

int main()
{
    char *str1 = "Mesg 1";
    char *str2 = "Mesg 2";
    char str3[] = "Mesg 3";
    char str4[] = "Mesg 4";

    printf("str1 = %p\n", (void *) str1);
    printf("str2 = %p\n", (void *) str2);
    printf("&str3 = %p\n", (void *) str3);
    printf("&str4 = %p\n", (void *) str4);

    return 0;
}

Output:

str1 = 0x400668
str2 = 0x40066f
&str3 = 0x7fffcc990b10
&str4 = 0x7fffcc990b00

是否有一个单独的常量地址空间用于此类用途?


该标准没有指定字符串文字的驻留位置,但很可能位于只读数据部分。例如在 Unix 系统上使用objdump您可以像这样检查只读数据部分:

objdump -s -j .rodata a.out

并使用实例 http://coliru.stacked-crooked.com/a/494ca248fcfc1286我们可以看到类似这样的输出:

Contents of section .rodata:
 400758 01000200 4d657367 20310073 74723120  ....Mesg 1.str1 
 400768 3d202570 0a004d65 73672032 00737472  = %p..Mesg 2.str
 400778 32203d20 25700a00 26737472 33203d20  2 = %p..&str3 = 
 400788 25700a00 26737472 34203d20 25700a00  %p..&str4 = %p..

C99标准草案部分6.4.5 字符串文字第 5 段 says:

[...] 然后使用多字节字符序列来初始化数组静态存储时间并且长度足以包含序列。[...]

这意味着字符串文字的生命周期就是程序的生命周期,第6段 says:

未指定这些数组是否不同,前提是它们的元素具有 适当的值。如果程序尝试修改这样的数组,则行为是 不明确的。

所以我们不知道它们是否不同,这将是一个实现选择,但我们确实知道我们无法修改它们。否则,它不会指定如何存储它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串文字的地址长度 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 如何在 XCode 4 中添加全局断点?

    我知道如何在 XCode 3 中执行此操作 但只是找不到如何在 XCode 4 中添加全局 而不是在特定行 断点 苹果开发者论坛中有一个很好的答案 需要付费帐户 https devforums apple com thread 68421
  • 如何在头库中定义(非方法)函数

    当编写头库时 例如Boost http www boost org 是否可以定义自由浮动 非方法 函数 而不会 1 使生成的二进制文件膨胀并且 2 引发 未使用 警告 当我在多个源文件包含的标头中定义一个函数 而这些源文件又链接到同一个二进
  • Openpyxl 无法读取 xlsx 文件,但如果我保存该文件,它会打开

    所以 我尝试使用 openpyxl 用这一行打开一个 excel 文件 wb bs openpyxl load workbook filename filepath 并得到这个错误 C Users T Gamer AppData Local
  • double 的 scanf 格式警告

    我正在开发的程序遇到了一个小问题 我不断收到警告format 1f expects type float but argument 2 has type double 所以我相当确定这是我的问题scanf format 我尝试到处寻找解决方
  • Cocoapod RealmSwift 运行时错误:`dyld:未加载库:@rpath/Realm.framework/Realm`

    我有一个项目曾经在设备上运行良好 但在我重新安装 cocoapods 后开始失败 奇怪的是我在模拟器中运行时没有遇到问题 我还能够在一个全新的项目中复制同样的问题 确切的错误是 dyld Library not loaded rpath R
  • 使用 Google Apps 脚本 Blob 转换数据 URI

    我正在尝试从 Google Apps 脚本中的数据 URI 上传并保存图像 除了设置的文件类型之外 一切都有效 我已经根据 Apps 脚本文档尝试了 newBlob 的所有变体 function doUpload dataURI var f
  • 如何访问我的 recyclerAdapter 中的共享 viewModel

    我的 viewModel 包含一些变量 例如应在 recyclerView 中创建多少个 cardView 因此 我正在寻找一种方法来访问适配器类中的相同 viewModel 对象 有没有办法或更好的选择 我的代码是 kotlin 语言 c
  • Sublime Text 3 - 代码片段不会在选项卡上触发,仅在 CSS 文件上触发

    我有一个片段不会在选项卡触发器上触发 这是我的代码
  • 查询日期和价格数据的矢量化方式

    问题 概述 我正在寻找一种矢量化方法来获取看到特定条件的第一个日期 当价格处于dfDays is gt 中指定的目标价格dfWeeks target 必须在设定目标的日期之后满足此条件 有没有办法进行以下时间序列分析apply或者类似的 在
  • 仅为 Swing 中的特定目标启用放置

    我正在尝试用两个在java中实现拖放JList实例 基本流程运行良好 但是 当我从一个列表中拖动字符串时 我想将放置目标限制为仅适用于第二个列表 我注意到 当我将一个字符串从一个列表拖动到桌面时 它会创建一个包含该字符串的文件 有什么办法可
  • 如何更改 Visual Studio 2010 工具提示的背景或前景色

    当您在不调试时将鼠标悬停在代码项上时 我需要更改 Visual Studio 2010 中的工具提示 显然我试图将我的 VS 主题设置为黑暗 但我似乎无法更改此设置 我安装了 Powertools Visual Assist X 和颜色主题
  • 如何处理具有实体关系的 Spring Boot/Spring Data 投影(嵌套投影)

    我正在尝试让嵌套投影在 Spring Boot 中工作 我有 2 个实体 Parent and Child 然而Parent有一个单向的 OneToMany与 的关系Child 以下是这些类 使用 Lombok Annotations En
  • 当元素相等时 Array.sort() 会产生意外结果?

    Heyo 我正在尝试对有时可能完全相等的数组进行排序 当数组不相等时 该函数可以完美运行 但当数组完全相等时 该函数似乎会随机放置元素 例如 我希望下面的代码打印 a b c 但得到的结果是 k a c d 这是 sort 函数的预期行为吗
  • 具有动态尺寸的全圆形按钮

    我正在尝试在 CSS 中创建圆形按钮 我用border radius 100 使按钮看起来像一个圆圈 但只有当我明确设置元素的宽度和高度时它才有效 但如果我这样做 按钮将不会调整以修复较大的文本 这是我到目前为止所尝试过的 round bu
  • 使用C代码查找文件的inode号

    我有程序 名称为 GiverootAccess 该程序可以接收当前目录 giverootAccess 所在目录 中的文件名作为命令行参数 然后该文件将获得 root 访问权限 该文件可以是可执行文件或 shell 脚本 现在的问题是 黑客可
  • Resources.getIdentifier(),deftype 参数的可能值?

    我正在尝试了解一个对投资组合执行计算的 Android 应用程序 投资组合存储在res values portfolio xml 当按下应用程序中的按钮时 将按如下方式检索投资组合数据 String portfolioName TextVi
  • 从 Angular 工厂中的 HTTP 返回响应数据

    factory Api function http var API http 127 0 0 1 4567 return get function method return http get API method success func
  • 如何在 WPF 中将控件标记为“私有”?

    对于 WinForms 程序 我已经习惯将控件的 Modifiers 属性标记为 私有 以防止外部类和其他任何您能够看到和弄乱它们的东西 由于 WPF 还很陌生 我在 WPF 中看不到明显的等效项 因此外部类无法看到我放到表单或另一个用户控
  • RegisterStartupScript和执行顺序

    我在用ScriptManager RegisterStartupScript注册对大量JS函数的调用 ScriptManager RegisterStartupScript this this GetType Script1 SomeScr
  • 字符串文字的地址长度

    我发现在带有 GCC 的 Linux 系统上 字符串文字的地址似乎比其他变量小得多 例如 以下代码生成下面所示的 o p include