[旧帖]
[讨论]C程序疑惑!
0.00雪花
发表于:
2009-7-9 00:39
1669
#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;
}
自已反汇编下,就当熟悉一下。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)