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

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

在 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),指针指向常量字符串区域,它们是不可修改的。

http://www.kler.cn/a/600972.html

相关文章:

  • uv:Rust 驱动的 Python 包管理新时代
  • 飞书只有阅读权限的文档下载,飞书文档下载没有权限的文件
  • Qt 线程类
  • 详解c++20的协程,自定义可等待对象,生成器详解
  • <tauri><rust><GUI>基于rust和tauri,实现多窗口与窗口间通信
  • ISIS-2 邻居建立关系
  • Python 编程中函数嵌套的相关解析
  • React 中React.memo的作用,如何利用它进行组件性能优化?
  • 单片机中C++的局部static变量的初始化仍然遵循控制流
  • Python爬虫异常处理:自动跳过无效URL
  • 2021年蓝桥杯第十二届CC++大学B组真题及代码
  • Redisson 实现分布式锁简单解析
  • OpenCV的Python开发环境搭建(Windows)
  • 目标和力扣--494
  • Readis自动化部署
  • ReentranLock手写
  • FPGA的直方图均衡
  • Python的线程、进程与协程
  • DrissionPage打造全自动音乐推荐系统——从爬虫到机器学习
  • 团体协作项目总结Git