关于内存及字符数组,字符串的一些注意点

1、数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。
(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
经过自己的代码测试:
静态局部变量未初始化和初始化为0的变量存储的地址是连续的
初始化为不为0的值的变量也是相互连续的
但上述两种类型的变量之间的地址却不是连续的,猜测静态局部变量和全局变量一模一样,
初始化为非0的放在.data段,未初始化和初始化为0的存放在bss段。


2、有些特殊数据会被放到代码段
(1)C语言中使用char *p = "linux";定义字符串时,字符串"linux"实际被分配在代码段,
也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。
(2)const型常量:C语言中const关键字用来定义常量,常量就是不能被改变的量。const的实现方法至少有2种:
第一种就是编译将const修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器)
第二种就是由编译器来检查以确保const型的常量不会被修改,实际上const型的常量还是和普通变量一样放在数据段的(gcc中就是这样实现的)。


3、指向字符串的指针和字符串本身是分开的两个东西
char *p = "linux";在这段代码中,p本质上是一个字符指针,占4字节,
"linux"分配在代码段,占6个字节;实际上总共耗费了10个字节,
这10个字节中:4字节的指针p叫做字符串指针(用来指向字符串的,理解为字符串的引子,但是它本身不是字符串),
5字节的用来存linux这5个字符的内存才是真正的字符串,
最后一个用来存'\0'的内存是字符串结尾标志(本质上也不属于字符串)。


测试:
(1)char *p = "linux"; sizeof(p)得到的永远是4,因为这时候sizeof测的是字符指针p本身的长度,和字符串的长度是无关的。
(2)strlen刚好用来计算字符串的长度(这个函数用来测字符数组没有意义)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值