空间属性概述 C语言

简介: 空间属性概述 C语言

前言

作为一个非科班的学生,之前让我说不同的存储有什么区别我是不清楚的,只是模糊的了解栈是什么堆是什么,但这些基础也是非常重要的,大致的了解能让我们在解决一些问题时有新的思路。


一、存储的几种段

不同变量不同操作申请到的空间位置都是不同的,下面简单介绍一下各个空间一般存储的内容。

栈区:一般作为程序编译即运行一些临时变量存储的位置,大小一般为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等的解释,这部分内容将会在以后的文章中出现。

相关文章
|
4月前
|
存储 C语言 C++
C语言基础专题 - 存储类(编辑中)
C语言基础专题 - 存储类(编辑中)
22 0
|
5月前
|
存储 人工智能 编译器
『C语言进阶』数据在内存中的存储规则
『C语言进阶』数据在内存中的存储规则
|
11月前
|
编译器 Linux C语言
C语言进阶学习日志:自定义类型 (细中细)(上)
C语言进阶学习日志:自定义类型 (细中细)
60 0
|
11月前
|
C语言
C语言进阶学习日志:自定义类型 (细中细)(下)
C语言进阶学习日志:自定义类型 (细中细)(下)
68 0
|
11月前
|
C语言
【进阶C语言】内存函数(详解)(二)
【进阶C语言】内存函数(详解)(二)
|
11月前
|
程序员 C语言 C++
【进阶C语言】内存函数(详解)(一)
【进阶C语言】内存函数(详解)(一)
|
11月前
|
存储 编译器 程序员
【C语言】存储类别(作用域、链接、存储期)、内存管理和类型限定符(主讲const)(一)
关键字:auto、extern、static、register、const、volatile、restricted、_Thread_local、_Atomic 函数:rand()、srand()、time()、malloc()、calloc()、free() 如何确定变量的作用域(可见的范围)和生命期(它存在多长时间) 设计更复杂的程序
|
11月前
|
存储 编译器 程序员
【C语言】存储类别(作用域、链接、存储期)、内存管理和类型限定符(主讲const)(二)
【C语言】存储类别(作用域、链接、存储期)、内存管理和类型限定符(主讲const)
|
存储 C语言
深究C语言-5结构体后续(除结构体外的自定义类型)
c99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员。
70 0
深究C语言-5结构体后续(除结构体外的自定义类型)
|
存储 编译器 C语言
C语言进阶第七篇【动态存储和柔性数组】(上)
C语言进阶第七篇【动态存储和柔性数组】(上)
178 0
C语言进阶第七篇【动态存储和柔性数组】(上)