空间属性概述 C语言

前言

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


一、存储的几种段

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

栈区:一般作为程序编译即运行一些临时变量存储的位置,大小一般为2m或1M。

堆区:完全由程序员操控即用malloc开辟的内存集中在堆区,一般为2G左右。

code段:我们书写的代码本身是存储在这个地方的。

rodata段:一些常量存放的地方。

data段:存类变量的地方,暂时可以理解成除了rodata里的都在这,这里关于static等会在别的文章细说。

二、rodata段与data段造成的区别

通过上面的介绍,我们知道rodata是存放常量的地方,该区域是只允许读而不允许写的,所以定义过的常量在里面就不可以修改了,下面通过一个代码解释一下。

#include <stdio.h>

int main()
{
    char *s = "hiHiHi";
    s[0] = 'H';
    printf("%s",s);
}

这句话其实是会报错的,在不理解不同变量会存储在不同位置之前,我肯定是想不明白这为什么会出错的,下面我们先看正确的代码。

#include <stdio.h>

int main()
{
    char s[] = "hiHiHi";
    s[0] = 'H';
    printf("%s",s);
}

指针和数组在这里替换了一下,为什么就会让这个程序通过呢?在原来是指针的时候这串数据存进去时是按照常量存进去的,自然会存在rodata段,而那个位置是只读不写的,所以无法改变,而数组是在data段存的数据,自然就能改变了。


总结

对于空间属性的了解能让我们在解决问题时多一种思路,作为写程序的基本功是非常重要的,这里不涉及static等的解释,这部分内容将会在以后的文章中出现。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康来个程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值