神奇的C代码之字符串数组的初始化

字符串数组的初始化方式有以下几种:

使用字符串字面量初始化数组,可以使用字符串字面量来初始化字符串数组。

例如:

char str[] = "hello world";

这将创建一个名为str的数组,其大小为12个字节(包括结尾的'\0'字符),并将字符串"hello world"复制到该数组中。

逐个初始化数组元素也可以逐个初始化数组元素。

例如:

char str[5];
str[0] = 'h';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';

这将创建一个名为str的数组,其大小为5个字节,并将"h"、"e"、"l"、"l"、"o"依次复制到该数组中。

使用初始化列表初始化数组,在C99标准中,可以使用初始化列表来初始化数组。

例如:

char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};

这将创建一个名为str的数组,其大小为6个字节,并将"h"、"e"、"l"、"l"、"o"、"\0"依次复制到该数组中。

需要注意的是,使用初始化列表初始化数组时,如果没有显式地指定数组大小,编译器将根据初始化列表中的元素个数自动计算数组大小。如果初始化列表中的元素个数超过了数组大小,编译器将会发出警告或错误。因此,最好显式地指定数组大小,以避免这种问题。

遇到的神奇代码之字符两字节对齐导致系统奔溃

char tbuf[] = "hello";

软件代码中定义了如此一行的代码,然后编译完成之后,操作系统无法正常工作。根据初始化的方式,这种定义毫无问题,但是出现的结果却令人大跌眼镜。

然后修改代码

char tbuf[10];
strcpy(tbuf,"hello");

编译完成系统运行正常。

不是很理解这个char tbuf[] = "hello"。对操作系统影响为何如此巨大。就将两种情况的代码反汇编出来。结果如下所示,仅仅是修改了一行代码对编译器产生的影响巨大。

最终查到的结果是:mmu未成功开启导致系统内跑的所有地址都是物理地址,所以在改变一个变量的同时,物理地址发生偏移,整个编译看起来就会差异巨大。

在遇到字节对齐的问题时---要去检查系统的mmu icache dcache---,前后耗费时间有点长。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值