C语言中整型数组的每个元素在内存中是如何存放的

C语言 码拜 6年前 (2015-05-11) 468次浏览 0个评论

各位大神,我是初学者,请求帮忙解决一个小问题:
int  arry[5={1,2,3,4,5};
printf(“%d\n”,strlen(arry));
输出结果是1;
我在网上搜索说是 arry[0]占4个字节:0x01 0x00 0x00 0x00   
那么strlen(arry)从0x01读起,到0x00就停止,于是返回长度1,
1在内存中的二进制不是00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01吗?
那不就是0x00 0x00 0x00 0x01,为什么是上面那样?(关键是这里帮我解释清楚一点)
求大神解释一下

10分
还涉及一个大小端的问题
对于小端
内存中存储的 1 是逆序的按照 
0x01 0x00 0x00 0x00存储 

这里的数组arr内存数据是 
0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x03 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x05 0x00 0x00 0x00 
所以strlen返回 1

0x开头的都是十六进制的数,如0xffff,表示为机器码(二进制): 11 11 11 11 11 11 11 11(B),   也就是表示方式不一样,一个十六进制可表示为四位二进制
恩,就是存储方式是小端存储的原因,高位时存储在低位上的。和我们习惯是按顺序写其实是大段存储了
10分
数组是存储在堆栈中,也就是先进后出的存储模式。
那个为什么返回是1,可以形象理解为:本来strlen是从头找道脚的,二数组的首地址是放到脚上的,strlen就只有从脚找到脚了,也就是一个单位,返回为1了
size_t strlen ( const char * str );

int[]  被 强转时只取第一个字符

10分
理解讨论之前请先学会如何观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

原来如此,又涨知识了,多谢各位指点!
我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?
这个应该是强制转换。。
引用 8 楼 QQ919769936 的回复:

我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

引用 10 楼 zhao4zhong1 的回复:
Quote: 引用 8 楼 QQ919769936 的回复:

我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

老师,我问的是怎么打开visual studio 2013的汇编窗口和堆栈窗口,不是VC++6.0

引用 11 楼 QQ919769936 的回复:
Quote: 引用 10 楼 zhao4zhong1 的回复:
Quote: 引用 8 楼 QQ919769936 的回复:

我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

老师,我问的是怎么打开visual studio 2013的汇编窗口和堆栈窗口,不是VC++6.0

我还真不信visual studio 2013中打开汇编窗口、堆栈窗口对应的热键Alt+8、Alt+7和VC++6.0不兼容!
如果真不兼容,请直接找微软投诉!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言中整型数组的每个元素在内存中是如何存放的
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!