一点一滴

Bug

char型的可以打印到遇到字符结束符为止[如图res1_char array.jpg];

int型数组名为起址的字符串仅能打印出4个字节,也就是第一个元素[如图res2_int array.jpg]。

对比:


 ----------char


-------------int

在对数组名称的作用的测试中,发现int型数组名的不解: 
int型数组名为起址的字符串仅能打印出4个字节,也就是第一个元素;而char型的可以打印到遇到字符结束符为止。

字符串不过因为每个元素占一个字节,我把每个元素占4个字节,咋滴就out了?


ps:

1.函数原型,如图prototype.jpg;

2.ide,如图compiler.jpg。devC++ 4.9.9.2.



DEbug:

a、C里面printf的格式化中%s表示的 是“从0xXX地址开始的,到 EOF 或EndOfLine结束的字符串”?
andlinux里表示不支持 对printf 之“%s %d ”等的说明。

-----此处确实是这样。实际上遇到的EOF通常的ASCII码值就是‘\0’的值[经查 是“0”]。

b、推测: 这里的4个字节,在打印出低位第一个字节后,就遇到了ASCII码值为“0”的,被当成EOF,

故end;紧接着‘7’这个字符所在的高一个字节 被赋值“0”,how?

1.赋值时不小心被默认赋值;2.其他未知方式。

c、在google的时候,偶然间发现症结。有这样的强制类型转换:int i = (int) 'a ';(转换可隐式)

i获得的正是‘a’的ASCII码值。俺就是这样赋值给int数组的,故‘7’以外的高字节被默认赋值0,就相当于EOF

d、经过对比,用字符串copy的库函数赋值就不存在楼主的问题

本着以据为实的态度,这里要把‘7’附近的高低几个字节赋值为非0,看看结果是不是恰恰反过来。

1.赋值:需注意大小系统的大小终端;2.何值:除‘7’所在的其他字节,某一位非0即可。见图。

这里的Endian由问题本身就可知了:1.打印是从低地址字节开始的;2.无聊int还是char,‘7’这个字节

都打印出来了,该字节为低地址;即低字节在低地址,小终端(升序)。 最好了解下,不然不小心

把相邻字节的赋了值,会影响的


Solution:

方法:需把int型指针强制转换成char型,逐字节赋。见下。
函数:int test_array_name_use(int *ptr_name, int size);

int *ptmp = ptr_name;


*((char *)ptmp + 1) = '1';
*((char *)ptmp + 2) = '1';
*((char *)ptmp + 3) = '1';
or  //memcpy((char *)ptmp+1, "111", 3);【不提倡,不会类型检查】。
试试打印,详见下图。


---给邻位赋值“1”---


---给邻位赋值“7”---


Conclusion:

bug成因

1.初始化导致 隐式 类型提升;
2.由1导致过早得到EOF。

这里涉及的问题似乎不少: 

1.初始化的有效性;2.隐式 类型提升;3.大小终端;4.字符和其ASCII码值的转换;5.格式化输入输出。

及时到google搜索,偶然得解。这样也可以复习,印象比较深刻。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值