前言
作为一个非科班的学生,之前让我说不同的存储有什么区别我是不清楚的,只是模糊的了解栈是什么堆是什么,但这些基础也是非常重要的,大致的了解能让我们在解决一些问题时有新的思路。
一、存储的几种段
不同变量不同操作申请到的空间位置都是不同的,下面简单介绍一下各个空间一般存储的内容。
栈区:一般作为程序编译即运行一些临时变量存储的位置,大小一般为2m或1M。
堆区:完全由程序员操控即用malloc开辟的内存集中在堆区,一般为2G左右。
code段:我们书写的代码本身是存储在这个地方的。
rodata段:一些常量存放的地方。
data段:存类变量的地方,暂时可以理解成除了rodata里的都在这,这里关于static等会在别的文章细说。
二、rodata段与data段造成的区别
通过上面的介绍,我们知道rodata是存放常量的地方,该区域是只允许读而不允许写的,所以定义过的常量在里面就不可以修改了,下面通过一个代码解释一下。
1. #include <stdio.h> 2. 3. int main() 4. { 5. char *s = "hiHiHi"; 6. s[0] = 'H'; 7. printf("%s",s); 8. }
这句话其实是会报错的,在不理解不同变量会存储在不同位置之前,我肯定是想不明白这为什么会出错的,下面我们先看正确的代码。
1. #include <stdio.h> 2. 3. int main() 4. { 5. char s[] = "hiHiHi"; 6. s[0] = 'H'; 7. printf("%s",s); 8. }
指针和数组在这里替换了一下,为什么就会让这个程序通过呢?在原来是指针的时候这串数据存进去时是按照常量存进去的,自然会存在rodata段,而那个位置是只读不写的,所以无法改变,而数组是在data段存的数据,自然就能改变了。
总结
对于空间属性的了解能让我们在解决问题时多一种思路,作为写程序的基本功是非常重要的,这里不涉及static等的解释,这部分内容将会在以后的文章中出现。