当前位置: 首页 > news >正文

字符串常量,数组和指针的不同形式

在 C 语言中,字符串 "hello" 存储在内存中是一个字符数组,它的内存布局通常如下:

1. 字符串常量区

字符串常量(如 "hello")是存储在程序的数据段(通常称为 .data.rodata)中的。这个区域是只读的,用于存储程序中的常量数据,防止修改这些常量。

因此,字符串 "hello" 会在内存中作为字符数组 {'h', 'e', 'l', 'l', 'o', '\0'} 存储,其中 '\0' 是字符串的结束符,表示字符串的结束。

2. 字符数组和指针的区别

  • char s1[] = "hello";
    在这种情况下,编译器将 "hello" 字符串复制到栈上为 s1 分配一块内存,通常是类似 {'h', 'e', 'l', 'l', 'o', '\0'} 的形式。这里,s1 是一个可以修改的字符数组,因此 s1 在栈上有自己的副本,允许你修改它的内容。

  • char *s2 = "hello";
    当你使用 char *s2 = "hello"; 时,s2 是一个指向常量字符串 "hello" 的指针,s2 存储的是指向内存中的一个位置的地址,而该位置存储了字符串常量 "hello"。该字符串常量在只读数据段中。

3. 内存分配

  • char s1[] = "hello"; 会将字符串 "hello" 存储到栈上的 s1 数组中。
  • char *s2 = "hello"; 会将字符串 "hello" 存储在只读数据段,并且 s2 指向这个字符串常量的位置。

示例内存布局:

假设栈的起始位置为 0x1000,并且字符串 "hello" 位于只读数据段的 0x2000

  • 对于 char s1[] = "hello";
    • 栈空间 0x1000 位置存储:{'h', 'e', 'l', 'l', 'o', '\0'},即 s1 数组的内容。
  • 对于 char *s2 = "hello";
    • s2 存储在栈中,假设 s2 = 0x2000(指向字符串 "hello" 在只读数据段的地址)。
    • 字符串 "hello" 存储在只读数据段的 0x2000 位置:{'h', 'e', 'l', 'l', 'o', '\0'}

总结:

  • 字符串 "hello" 在内存中是一个字符数组 {'h', 'e', 'l', 'l', 'o', '\0'},并且存储在常量区域中(对于指针的情况)。
  • 对于字符数组(如 s1[]),会在栈中复制该字符串的内容,允许修改。
  • 对于字符串常量(如 s2),指针指向常量字符串区域,它们是不可修改的。

相关文章:

  • 2000-2019年各省地方财政契税数据
  • 记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
  • 比较Linux的Shell的 `EOF` 与 `echo` 与 `printf` , 将文本输出到文件
  • 003-51单片机-最小系统
  • 科学计算(2):矩阵特征值计算
  • gradio调用多个CSS的HTML页
  • 【AI论文】MARS:融入苏格拉底引导的多代理框架实现自动化提示优化
  • [已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)
  • C++高阶
  • 哈希--哈希桶
  • wordpress主题开发框架(灵狐框架),开发文档使用教程
  • Docker 搭建 PlantUML 服务:高效生成 UML 图的最佳实践
  • 算法-动态规划二
  • Day38 | 1365. 有多少小于当前数字的数字、941. 有效的山脉数组、1207. 独一无二的出现次数、283. 移动零、189. 轮转数组
  • shell脚本一键安装docker+docker-compose,支持x86_64、arm64双架构
  • 桑福德·韦尔策划美国捷运公司收购南美银行案例分析
  • 数组子序列比较的SIMD优化
  • 字典树与01trie
  • 数值分析作业插值法2
  • CD18.【C++ Dev】类和对象(9)(声明和定义分离的写法以及代码复用)
  • 常见的网络营销策略都有哪些/seo站
  • 做网站建设的平台/企业营销策划方案范文
  • 网站建设公司格/奇零seo赚钱培训
  • 给别人做网站赚钱吗/2020最近的新闻大事10条
  • 冀州网站建设/免费建站哪个最好
  • 手机版网站建设价格/百度指数搜索榜