从内存看数组初始化

前言

本人在接触了一维数组后发现一维数组的初始化有许多的不同,这些差异不易察觉,本文从内存角度来分析整形和字符数组在不同初始化下带来的影响。

目录:

   整形数组

   字符数组

(1)用字符初始化字符数组

(2)用字符串初始化字符数组

一 整形数组

如果我们定义一个全局数组,不用初始化数组元素也会自动赋为0。

 

想必小伙伴们都知道数组的初始化格式,如果我们定义了一个数组,并且已经定了数组大小,此时我们对数组初始化可分为
1完全初始化(数组每个元素都被赋值了)
2部分初始化(如图,数组arr2中只有第一个元素被赋值)

int arr1[3] = { 1,2,3 };//完全初始化
int arr2[3] = { 1 };//部分初始化

然后我们从内存来看数组,我在vs2019中逐过程调试下打开窗口,进入监视,在名称中输入数组名即可查看数组在内存的存储,如图,完全初始化的arr1里面的元素依次被赋成了1,2,3,而不完全初始化的arr2的第二,三个元素则被赋为了(这是乌龟的臀部—规定,大家理解理解就好,此外,如果arr2字符数组,第二,三个元素则默认为‘\0’)

 如果我们定义的数组不限定大小,编译器则会根据我们数组存的元素来分配空间,不多也不少,故我觉得不存在部分初始化和完全初始化的区别,也不会出现将未初始化元素赋成0的情况

int arr3[]={1,2,3};

 此时整形数组的初始化情形大致说完了,我再说个初始化容易遇到的错误就到下一个部分—字符数组的初始化

   错误一:

    大家看这个arr2和上面那个部分初始化中举例的arr2有什么不同,唯一不同的就是右边,我将花括号删去了,因为我看字符数组用字符串初始化可以不加花括号,那我就想在字符数组用字符初始化和整形数组这边试试。

 二 字符数组

char arr4[3]={'b','i','t'};//完全初始化
char arr5[3]={'b','i'};//不完全初始化
char arr6[]=['b','i','t'];

(1)用字符初始化字符数组

注意:下面我要说的挺有意思

我想小伙伴们在接触数组前就已经接触过printf,都知道如果对字符数组arr1用%s打印会打印出如下结果,因为我们存的是用单引号引起的字符,存储时不会末尾加个’\0‘这个结束标志,但printf恰恰要遇到这个结束标志才停止,这时候你可以把printf想象成一头疯牛,冲出了数组,不知道在什么地方遇到结束标志才停止。

(重点来啦)在整形数组中我提到过如果字符数组比如arr5是未完全初始化的,第二个元素,第三个元素默认为’\0‘,这不是结束标志符,如果我们打印这个数组,它会不会像arr4那样打印烫烫烫呢?结果如下

 

 这说明程序会停止,当然这成立的基础是我们限定了数组大小,只有我们限定了大小,数组才会出现未完全初始化的情况,这是概念问题。在用字符初始化字符数组我想留给大家一个小问题,希望大家帮我解答解答,arr4和arr5在内存中存储的时候是比较近的,那么理论上来说如果printf打印arr4到arr5的内容时如果都没遇到停止符号,最后也会遇到arr5中的停止符号而停止,但我基本上都是看到printf打印到arr5之前就停了,希望大家能满足我这个好奇心

(2)用字符串初始化字符数组

刚刚说的都是字符数组存字符的情况,而字符数组还可以存字符串,字符串的初始化则比较单一,右边可以省略花括号来初始化,而在存储时我们可要注意数组能不能容纳字符串

char arr7[3] = "bit";
char arr8[4] = "bit";

如此来看虽然“bit”这个字符串的大小是四个字节,但是当放到三个字节大小的数组中'\0'也能被舍去,这时候要是用printf程序可就不会产生我们想要的结果,当然如果数组大于所存的字符,未赋值部分也会被'赋为\0'。还有就是大家在内存中应该还发现字符的旁边还有几个数字,98,105,116,这些数字分别是字符b,i,t的ASCII码值,在c语言很多地方字符与ASCII码值都是等价的,比如打印的时候,用%c打印98,结果是字母,我下一篇想写一篇关于printf的博客,希望大家支持。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小何只露尖尖角

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

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

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

打赏作者

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

抵扣说明:

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

余额充值