|
![]() | 作者: kert_t8 [kert_t8]
![]() |
登录 |
有如下代码:代码: 单步跟踪上面的代码,发现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了的 但是这个问题启发了我。一会儿在说问题及结论,先说我所做的测试 代码: 输出的结果显示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号