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

天下莫柔于风 2015-04-27 12:03:45
各位大神,我是初学者,请求帮忙解决一个小问题:
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,为什么是上面那样?(关键是这里帮我解释清楚一点)
求大神解释一下
...全文
791 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
天下莫柔于风 2015-04-28
  • 打赏
  • 举报
回复
我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?
赵4老师 2015-04-28
  • 打赏
  • 举报
回复
引用 8 楼 QQ919769936 的回复:
我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
RecvW 2015-04-28
  • 打赏
  • 举报
回复
这个应该是强制转换。。
赵4老师 2015-04-28
  • 打赏
  • 举报
回复
引用 11 楼 QQ919769936 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 QQ919769936 的回复:] 我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。[/quote] 老师,我问的是怎么打开visual studio 2013的汇编窗口和堆栈窗口,不是VC++6.0[/quote] 我还真不信visual studio 2013中打开汇编窗口、堆栈窗口对应的热键Alt+8、Alt+7和VC++6.0不兼容! 如果真不兼容,请直接找微软投诉!!
天下莫柔于风 2015-04-28
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 QQ919769936 的回复:] 我用的是VS2013,好像找不到汇编窗口和堆栈窗口,只找到反汇编窗口,并行堆栈和调用堆栈窗口,怎么打开汇编窗口和堆栈窗口呀?
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。[/quote] 老师,我问的是怎么打开visual studio 2013的汇编窗口和堆栈窗口,不是VC++6.0
lin5161678 2015-04-27
  • 打赏
  • 举报
回复
还涉及一个大小端的问题 对于小端 内存中存储的 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
天下莫柔于风 2015-04-27
  • 打赏
  • 举报
回复
原来如此,又涨知识了,多谢各位指点!!!
赵4老师 2015-04-27
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。)
Isnis-fallen 2015-04-27
  • 打赏
  • 举报
回复
size_t strlen ( const char * str ); int[] 被 强转时只取第一个字符
huangkui201310 2015-04-27
  • 打赏
  • 举报
回复
数组是存储在堆栈中,也就是先进后出的存储模式。 那个为什么返回是1,可以形象理解为:本来strlen是从头找道脚的,二数组的首地址是放到脚上的,strlen就只有从脚找到脚了,也就是一个单位,返回为1了
huangkui201310 2015-04-27
  • 打赏
  • 举报
回复
恩,就是存储方式是小端存储的原因,高位时存储在低位上的。和我们习惯是按顺序写其实是大段存储了
Z_早睡晚起 2021-07-02
  • 举报
回复
@huangkui201310 ??
huangkui201310 2015-04-27
  • 打赏
  • 举报
回复
0x开头的都是十六进制的数,如0xffff,表示为机器码(二进制): 11 11 11 11 11 11 11 11(B), 也就是表示方式不一样,一个十六进制可表示为四位二进制

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧