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

【C字符串与内存布局探索实验】

C字符串与内存布局探索实验

一、C字符串

int main(){char a[10] = "asd\0asd";char b[5] = "abce";b[4] = 'e';cout << b << endl;cout << a << endl;cout << "&a is " << &a << "\n&b is " << &b << endl;return 0;
}/*输出结果为:
abceeasd
asd
&a is 0xd3623ffaf6
&b is 0xd3623ffaf1*/

首先其中字符数组a在中间塞了一个’\0’,对于C风格字符串,一个字符串的结束标志就是‘\0’,所以在输出a时,就会只输出asd。

然后就是数组b,对于字符串"abce"其中最末尾的不是e而是’\0’,字符串常量"abcd"会被编译器编成c风格字符串"abcd\0";

然后人为地将b数组最后一个’\0’替换掉,破坏掉这样的C风格,在进行cout << b时,它就不会被识别出停止的位置,从而一直往后输出下去

然后这里因为内存布局的原因,a和b是相邻的,且a在b的后面,输出完之后b就接着输出a,然后遇到a中\0,停止输出。

好的,现在再来看看这样一个案例:

void testString(){char a[5] = "abcd";a[4] = 'e';cout << a << endl;cout << "testString() endl" << endl;cout << "in function &a is " << &a << endl;	
}/*
输出结果为:
abcdep?.
*/

运行上面的函数,由于该函数中局部变量只有它一个,没有其他的\0和靠的近,这一次就没有正常地结束输出,而是发生了一些不可控制的。

二、内存布局

参考连接C/C++:内存分配,详解内存分布(P:图解及代码示例)_全局变量内存分布图-CSDN博客

在这里插入图片描述

以32位机为例,上图中从上往下,地址一次减小,对于内核空间最低地址是0xC000 0000 , 到最高地址是0xffff ffff 共1个GB 的空间,代码段下方还存在一个 reserved / 零页 地址为 0x0000 0000。

其中最核心的一点就是栈是从高地址往低地址增长,上面的代码例子中,main函数中a先被压入栈,然后b被压入栈,这样相邻就刚好有一个\0

而光对void testString()函数来做,内部就没有专门的\0。

最后再来贴上各个段详解(Linux/x86视角)

  1. 代码段(.text)
    只读、可执行。多次运行同一可执行文件时,物理页共享。
  2. 只读数据段(.rodata)
    字符串常量、const 全局变量。试图写入会触发段错误(SIGSEGV)。
  3. 已初始化数据段(.data)
    全局 int g = 5; 存在这里;程序启动时从可执行文件拷初值。
  4. BSS 段(.bss)
    全局 int h; / static int k; 存在这里;可执行文件里只记录大小,不占磁盘空间,内核在加载时一次性清零。
  5. 堆(heap)
    malloc / calloc / new 从这儿拿内存。
    高地址增长:通过调整程序中断点 brk 或匿名 mmap 实现。
    需要手动 free / delete,否则泄漏。
  6. 内存映射段(mmap)
    动态库、POSIX 共享内存、大页、mmap 文件映射都落在这一带。
    地址比堆高,但比栈低;增长方向与堆无关,由内核随便找一块空闲区。
  7. 栈(stack)
    每个线程独立一块,默认 8 MB(ulimit -s 可改)。
    低地址增长:函数调用一次,栈指针减一帧;返回时加回。
    存放:
    • 局部变量(含 char buf[5] 这种数组)
    • 函数参数、返回值
    • 保存的寄存器、返回地址
      若无限递归或超大局部数组,会踩到最下方“守护页”→ 触发 stack overflow(Linux 发 SIGSEGV)。
http://www.dtcms.com/a/607281.html

相关文章:

  • VS CODE 使用技能详解
  • 长武网站建设东莞民营企业
  • 简单手机网站可信赖的做pc端网站
  • 沃尔玛的网站建设政务服务大厅网站建设方案
  • LKS32MC08x MCPWM 寄存器级控制:实现电机 P/N 安全互锁与速度控制
  • 软件开发网站策划方案wordpress图片上传接口
  • 今日内容总结
  • 除了PubMed,还有哪些稳定好用的查找医学文献的平台?
  • 网站登记模板网站免费建设
  • 网站建设在电子商务中的作用的看法外贸网站开发营销
  • bug【celery】
  • 常用个人网站襄县网站建设
  • MiniGPT-4:解锁 LLM 驱动的高级视觉语言能力
  • 网站设计常用软件都有哪些台州超值营销型网站建设地址
  • Rust入门:基础语法应用
  • 中国建设银行广西分行网站首页肥西县建设局网站
  • 遥感论文学习
  • 镇江市住房城乡建设局网站qq免费的推广引流软件
  • github下载repo中的单独文件
  • 营销网页wordpress数据库优化
  • 网站轮播图居中代码怎么写工作室建设规划
  • 青岛市建设安全监督站网站外贸网站建设原则
  • 大作设计网站官网登录微赞直播平台
  • 宿州网站建设公司哪家好html电子商务网站模板下载
  • 做搜狗手机网站排名软2345官网
  • 烟台网站排名seowordpress主题字体
  • 深圳提供网站建设制作wordpress收费会员
  • [科普] 卫星共视授时原理
  • 个人建设网站流程图温州市微网站制作电话
  • 做直播小视频在线观看网站龙岩个人小程序开发