个人知识库 个人知识库
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub

Agnes001

坚持是一件很伟大的事业
首页
关于
  • C语言
  • CPlusPlus
  • Linux
  • PHP
  • Nginx
  • MySQL
  • Redis
  • Docker
  • Kubernetes
  • SRS
阅读
常用工具
  • 分类
  • 标签
  • 归档
GitHub
  • C语言

  • CPlusPlus

    • 基础特性

      • 枚举
      • 字符指针
        • char*的用法
    • vs2019设置
    • C++11特性

    • 并发编程

    • 引用
    • 类和对象
    • 友元和运算符重载
    • 继承
    • 继承和多态
    • 模板
    • C++基础总结
    • 类型转换
    • 异常
    • 容器
    • 算法
    • C++程序设计
    • C++ Primer总结
    • 编程技巧
    • 标准库体系结构与内核分析
    • 设计模式
    • cmake配置C++工程
    • libcurl的使用总结
    • web开发框架--drogon
    • log4cplus使用
    • C++数据类型
    • 函数
    • 线程
    • 进程
    • 文件操作
    • 日常问题记录
    • Cpp案例程序
    • 多线程
    • 侯捷c++11新特性
    • 侯捷stl
  • Lua技术栈

  • edoyun

  • 内存管理

  • 数据结构

  • 网络编程

  • Linux

  • 池化技术

  • 操作系统

  • python

  • 编程技术
  • CPlusPlus
Agnes001
2022-06-22

C/C++字符指针

内存从低到高的分布

  • 代码段[.text]: 存储机器码序列/全局常量/代码/字符串常量.

  • 初始化数据段: 初始化的全局变量/初始化的(局部/全局)静态变量(static修饰的变量)。

  • 未初始化数据段[.bbs]: 未初始化的全局变量/未初始化的(局部/全局)静态变量(static修饰的变量).

  • 堆(从低地址往高低至增长): 所使用的局部变量还是在栈上,内容则在堆上.手动释放或者程序结束时由操作系统释放回收.

    • 由程序员分配[new/malloc/realloc/calloc].
    • windows下, 申请的堆空间一般小于2GB。
  • 栈(从高地址往低地址增长): 局部变量/局部常量(const)[局部只读变量]/函数调用时返回地址/调用者的环境信息(例如某些机器寄存器).

    • 由编译器自动分配释放管理.
    • windows下,申请的栈空间一般为2MB。
    • Linux默认的栈空间是8MB,可以用ulimit -s 命令来修改。
  • 命令行参数和环境变量

  • 栈区(stack):存储函数的参数,局部变量等,由编译器自动分配和释放,;

  • 堆区(heap):由程序员申请和释放,主要是new出来的空间,需要手动delete1,变量还是在栈上,但是指向的内容是在堆上;

  • 已初始化数据区:已经初始化过的全局变量和静态变量(包括局部静态变量);

  • 未初始化数据区:未初始化的全局变量和静态变量,在空间上与已初始化区相邻;

  • 文本区:包括代码段、字符串常量、全局常量等。

# char*的用法

以写在main函数里的char* p为例,p就是在栈上的一个平平无奇的指针变量,如果说它有什么特别的地方,那就是它是字符类型的,可能跟其他类型的长度有点区别。 指针变量本身是什么无关紧要,重要的是它所指向的位置。

char*的用法 如果写下以下语句:

char *p = "hello";

那么p就指向了一个文本区的字符串常量的首地址,这就为以后p的行为埋下了隐患,如果单纯是读取还好,等到你要改变p的内容的时候,就会出错,因为常量在程序中是不可以改变的!

如果写成以下语句呢?

n = 20;
char *p = new char[n];
strcpy(p,"hello");
delete[] p;

那么就是在堆上给开辟了一片长度为n个字符的空间供p享用。然后给p一个字符一个字符地传入了“hello”这个字符串,并以"\0"结尾。

编辑此页
枚举
vs2019设置

← 枚举 vs2019设置 →

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式