论坛: 编程破解 标题: memcpy问题-其实是sizeof()出问题了-已解 复制本贴地址    
作者: kert_t8 [kert_t8]    论坛用户   登录
有如下代码:
代码:

i=sizeof(*dst);
j=sizeof(*src);
x=sizeof(HBA);
memcpy(dst, src, sizeof(HBA));



单步跟踪上面的代码,发现i=j=x。但是执行memcpy的时候出现错误说“xxxx.exe中的 0x10216393 (msvcr71d.dll) 处未处理的异常: 0xC0000005: 写入位置 0x029fb000 时发生访问冲突”

我就奇怪了,既然我都可以保证原位置,目标位置,拷贝内容三者的大小一致,为什么memcpy居然还会出错?


[此贴被 月之御者(kert_t8) 在 12月27日11时49分 编辑过]

地主 发表时间: 06-12-27 10:21

回复: SysHu0teR [syshunter]   版主   登录
dst和src应该是malloc了吧

B1层 发表时间: 06-12-27 11:06

回复: kert_t8 [kert_t8]   论坛用户   登录
malloc了的

但是这个问题启发了我。一会儿在说问题及结论,先说我所做的测试
代码:

struct abc {
unsigned a:1;
};

struct a {
    int i;
    int j;
};

struct b {
    int i;
    int j;
    int x;
    int y;
};

int _tmain(int argc, _TCHAR* argv[])
{

struct b sb;
struct a sa;
struct b *psb;
printf("sizeof(psb):%d\n", sizeof(*psb));
psb = (struct b *)&sa;
printf("sizeof(psb):%d\n", sizeof(*psb));
psb = &sb;
printf("sizeof(psb):%d\n", sizeof(*psb));

getchar();
return 0;
}



输出的结果显示psb的size全都是16
可见,sizeof()这个函数对变量的判断完全是基于变量的类型,而psb是一个指向struct b的指针,*psb的大小肯定是永远不变的sizeof(struct b)的大小,不论它是否是空指针,是指向struct b还是struct a。

我一直以为sizeof()如果参数是一个变量,它一定会检查这个变量可以容纳的内存空间大小,现在才发现这有多么幼稚。笨啊笨啊~~~~


syshunter, 谢了谢了

B2层 发表时间: 06-12-27 11:37

回复: kert_t8 [kert_t8]   论坛用户   登录
嘿嘿,发现没说清楚我开始提出的问题的原因

其实是因为我想利用派生的思想,利用本来操作struct a的操作操作struct b(因为b由a派生麻),但是我封装没做好,之前的对struct a的操作写入链表就只写了sizeof(struct a)那么多,之后我再取出来,用memcpy()写内存,这个时候就报错了,越界。我当时不知道错误的原因,就用我在一楼给的那段代码debug,希望找出dst和src的大小,看是不是这两个大小的问题。结果这段代码本身有问题,就是我在楼上说的那些问题,导致我认为dst和src大小是一样的(实际原因是因为dst和src都是HBA类型的),因而产生了疑问

结论就是sizeof的用法跟我想的不一样,大家回去要好好看看sizeof的用法

B3层 发表时间: 06-12-27 11:44

回复: SysHu0teR [syshunter]   版主   登录
更贴切的“派生”是不是应该这样:
typedef struct _sa {
int x;
int y;
} SA;
typedef struct _sb {
SA a;
int z;
} SB;
void fun(SA *sa) {
printf("x=%d, y=%d\n",sa->x,sa->y);
}

B4层 发表时间: 06-12-27 12:04

回复: kert_t8 [kert_t8]   论坛用户   登录
那你就不能使用

SB b;
fun((SA *)&b);



B5层 发表时间: 06-12-27 12:10

回复: SysHu0teR [syshunter]   版主   登录
为什么?

B6层 发表时间: 06-12-27 12:15

回复: kert_t8 [kert_t8]   论坛用户   登录


我糊涂了,糊涂了

可以用,可以用

对对,这样保险的多

B7层 发表时间: 06-12-27 12:20

回复: NetMelody [mmgg00]   论坛用户   登录
sizeof不是函数,它是。。。。。哈哈

B8层 发表时间: 06-12-28 12:11

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号