首页
社区
课程
招聘
[旧帖] [讨论]C程序疑惑! 0.00雪花
发表于: 2009-7-9 00:39 1623

[旧帖] [讨论]C程序疑惑! 0.00雪花

2009-7-9 00:39
1623
#include"stdio.h"
#include"string.h"
main()

  char a[]={'1',};
  int   b=strlen(a);
    printf("%d",b);
}
 今天把此程序运行了一下,结果是7;
以前也遇到过,只是没探个究竟。
都知道strlen()是遇到‘\0'就停止,以为只是碰巧地址“a+7”刚好是个'\0'
今天没事用反汇编了一下,收获倒不小。
mov     byte ptr[ebp-4],31h


这是对字符数组a赋值,为什么是[ebp-4]这个地址,要不是以前看到内存对齐
这个概念还真不知道。这应该就是对齐吧。
[ebp-4]-[ebp]的值为31 cc cc cc
查看了内存[ebp]-[ebp+4]处的值总是c0 ff 12 00
这就是指令push ebp中ebp的值。 
strlen()从[ebp-4]开始测试直到后面遇到00停止刚好就是7个字符

令我映象最深的就是“对齐”的概念!!
#include"stdio.h"
#include"string.h"
main()
{ char c='c';
  char a[]={'1',};
   int  b=strlen(a);
    printf("%d",b);
}
VC6.0运行后结果是11;难道是变量c也要占4个字节?
char型变量不是只占一个字节的吗
我就用sizeof(c)测试了一下,输出1.的确是点一个字的啊
反汇编中赋值是这样的

mov byte ptr [ebp-4],63h//对C的赋值
`
`
`
mov byte ptr[ebp-8],31h//对数组a的赋值
`
`
`

c与a之间隔4个字节,为什么是这样啊
大侠们~~指点迷津吧。/

/××××××××××××××××××××××××××××××××/
我不知道如何让char只占一个字节。
看了之后或许有点启发,测试测试。VC6.0
#include"stdio.h"

char a='a';
char str[]="ddddd";
int  main()
{

   
    printf("%d",str-&a);//输出多少?
    return 0;
}
/////////////////////////////////////////
#include"stdio.h"

int  main()
{
   char a='a';
   char str[]="ddddd";
   
    printf("%d",str-&a);//又是输出多少?
    return 0;
}

自已反汇编下,就当熟悉一下。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个与编译器相关。
获取数组的大小用:sizeof
获取字串长度用:strlen

因为未知数组长度,在编译时,会预留空间,里面保存的随机数。

字答串和字符数组是有区别的。
2009-7-9 06:09
0
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
由于你程序中只定义了那两个变量,所以栈往下只延伸相应的字节数,你得知道在栈里面不存在byte和Word变量,全都是dword,所以两个字符就占8个字节了,再加上栈底指针的3个字节就是11了。

关于为什么栈里面都是dword,栈是一个必须进行内存对齐的区域,因为这里的访问频率是整个内存中最高的,没有对齐的话速度会变得很慢。
2009-7-9 08:54
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gqh
4
str函数就是蹉,呵呵
2009-7-9 10:18
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
txx
5
那变量c在内存中实践还是占4个字节喽?
2009-7-9 12:29
0
雪    币: 432
活跃值: (330)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lqj
6
学习!这类文章有助于我们初学者的学习。
2009-7-9 15:43
0
雪    币: 89
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
现在和以前有一点概念上的区别啦!! 注意32环境和16位环境的区别。
  最明显的例子就是int类型 16位环境下就是  2  ^16  次方左右,  32位环境下就是 2^32次方范围左右。
当然开发环境是和 CPU是否说32位 操作系统是否是32位还有编译程序是否是32位有关的。
说得更明白点就是32位的CPU才能有32位的操作系统 32位的操作系统才能有32位的编译程序。当然如果操作系统向下兼容的话也可以装16位 编译程序 。一般在情况下都可以向下兼容,但是不能向上兼容!所以一般做软件开发都是要明白自己的硬件环境和开发环境,以及客户的操作环境!!否则就会有最后交货时候的麻烦!!
2009-7-9 16:08
0
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
变量c占用了4个字节的空间,但是其中三个字节未被使用。
2009-7-9 16:51
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
txx
9
变量c占用了4个字节的空间,但是其中三个字节未被使用。

那岂不造成内存空间浪费?
2009-7-9 17:53
0
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个没办法,如果不进行对齐的话会导致其后的所有变量都可能无法对齐,这种环境下时间比空间重要。
2009-7-9 19:09
0
雪    币: 74
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
用VC编译的时候,可以调整对齐的字节数,用的是/Zp设置。建议研究一下structure的size和偏移会有更深刻的理解。
2009-7-9 21:53
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看了LZ的程序,觉得有些疑惑,字符串数组最后一个元素不是应该为‘\0’吗?
char a[]={'1','\0',};或者是char a[]="1";
不然就会遇到上面的情况,strlen就读到字符以外的内存数据去了。
2009-7-10 12:26
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个语言太抽象。。。
2009-7-10 13:16
0
雪    币: 100
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
小小的程序居然这么有学问!
2009-7-10 13:34
0
雪    币: 63
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我机器上运行时,结果还不一样。

debug下,b=8,内存31 cc cc cc cc c0 ff 12 00
release下,b=4,内存31 f3 11 40 00
(环境:VS2003)
2009-7-10 14:37
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
txx
16
那个/Zp 选项不是只对结构体内存对齐有效吗?

char c='c';
char a[]={'1',};

但这不是结构体啊。
2009-7-12 22:56
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
txx
17
顶············
2009-7-15 22:36
0
游客
登录 | 注册 方可回帖
返回
//