空间属性概述 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++_38(C++的IO流+空间适配器)STL六大组件联系(下)
从C语言到C++_38(C++的IO流+空间适配器)STL六大组件联系
45 5
|
4月前
|
算法 C语言 C++
从C语言到C++_38(C++的IO流+空间适配器)STL六大组件联系(上)
从C语言到C++_38(C++的IO流+空间适配器)STL六大组件联系
41 0
|
C语言
C语言 堆区空间,malloc
前面测试,普通的数组变量默认最大不能申请1M的空间,甚至远少于1M的空间,毕竟程序中的其他变量也需要使用空间。总共就1M,要省着用。 想要使用更大的,没有限制的空间,C语言给我们提供了方式:
114 0
C语言 堆区空间,malloc
|
存储 编译器 C语言
深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小
深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小
140 0
深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小
|
编译器 C语言 C++
C语言面试题 - 字符空间操作类
C语言面试题 - 字符空间操作类
75 0
|
算法 C语言 C++
[c语言] 返回栈空间地址 问题
1.定义头文件加结构体变量 2.创建一棵树 3.初始化栈 4.头插法入栈 5.判断栈是否为空 6.出栈操作 7.先序遍历 8.中序遍历 9.后序遍历 10.主函数调用 11.运行结果:
111 0
|
算法
<时间复杂度和空间复杂度计算>《数据结构(C语言版)》
<时间复杂度和空间复杂度计算>《数据结构(C语言版)》
123 0
<时间复杂度和空间复杂度计算>《数据结构(C语言版)》
|
机器学习/深度学习 算法 C语言
时间复杂度和空间复杂度计算(数据结构C语言实现1)
时间复杂度和空间复杂度计算(数据结构C语言实现1)
390 2
时间复杂度和空间复杂度计算(数据结构C语言实现1)
【C语言】想要节省空间,你必须要知道——动态内存管理(附通讯录动态内存版源码)(二)
【C语言】想要节省空间,你必须要知道——动态内存管理(附通讯录动态内存版源码)(二)
【C语言】想要节省空间,你必须要知道——动态内存管理(附通讯录动态内存版源码)(二)
|
编译器 C语言
【C语言】想要节省空间,你必须要知道——动态内存管理(附通讯录动态内存版源码)(一)
【C语言】想要节省空间,你必须要知道——动态内存管理(附通讯录动态内存版源码)(一)
【C语言】想要节省空间,你必须要知道——动态内存管理(附通讯录动态内存版源码)(一)