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"结尾。