memcpy 第三个参数过大, 请教各位大虾

xyz_007008 2010-09-12 10:13:36
char * a = "111111111111111111111111111111111111111";
string ss = "22";
char * ww = NULL;

ww = (char*)malloc(strlen(a) + 1);
memcpy(ww, ss.c_str(), strlen(a) + 1);
CPPUNIT_ASSERT(strcmp(ss.c_str(), ww) == 0);

为什么上面这段代码运行时CPPUNIT_ASSERT不报错,但是在debug是memcpy(ww, ss.c_str(), strlen(a) + 1)会提示"unhandled exception in xxxexe 0xC0000005:Access Violation".
...全文
667 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-09-13
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
walkersfaint 2010-09-13
  • 打赏
  • 举报
回复
越界了吧
liujiaji 2010-09-13
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!


这位兄弟貌似经常以这种方式出现啊~
龙二伤 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]

这位兄弟貌似经常以这种方式出现啊~
matrixcl 2010-09-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xyz_007008 的回复:]
但是CPPUNIT_ASSERT(strcmp(ss.c_str(), ww) == 0);没报错
[/Quote]

ss.c_str() = "22"
ww = "22\0*************";

strcmp的确相等。
还不明白看strcmp的实现
pengzhixi 2010-09-12
  • 打赏
  • 举报
回复
ss的长度才2,你确要越界访问。strlen(ss.c_str())
东大坡居士 2010-09-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xyz_007008 的回复:]
但是CPPUNIT_ASSERT(strcmp(ss.c_str(), ww) == 0);没报错
[/Quote]

不是没报错,而是直接异常退出了啊
xyz_007008 2010-09-12
  • 打赏
  • 举报
回复
貌似memcpy拷贝不能读的内存,在运行时也不会退出,能拷贝多少就拷多少
xyz_007008 2010-09-12
  • 打赏
  • 举报
回复
跑CPPUNIT用例的时候没发生错误,用例全都跑过了,但是debug时就出异常了。
forestfire 2010-09-12
  • 打赏
  • 举报
回复
这个问题很老残,代码肯定不能这么写,假如ss后面的内存不能读写的话,那么不应该只是warming了
xyz_007008 2010-09-12
  • 打赏
  • 举报
回复
但是CPPUNIT_ASSERT(strcmp(ss.c_str(), ww) == 0);没报错
mymtom 2010-09-12
  • 打赏
  • 举报
回复
ss的长度是2, strlen(a) + 1的长度超过2了。
npuhuxl 2010-09-12
  • 打赏
  • 举报
回复
可能和ss实际分配的内存大小有关系
sundq12 2010-09-12
  • 打赏
  • 举报
回复
楼上说的对,断言是为了防止某一个变量等于某一个值,所以如果你你要防止ss等于ww出现的话,你应该这样用断言:


CPPUNIT_ASSERT(strcmp(ss.c_str(), ww) != 0);

而不是这样

CPPUNIT_ASSERT(strcmp(ss.c_str(), ww) == 0);

69,369

社区成员

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

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