strncpy在debug和release下结果不一致,何解?

炼气士 2011-08-11 10:39:34

int findstr(char *dst)
{
int dst_len,num=0;
char *str_tmp=(char *)malloc(4);

while(*dst!='\0')
{

strncpy(str_tmp,dst,3);
if(strcmp(str_tmp,"the")==0)
{
num++;
}
dst++;
}

return num;
}

int main(int argc, char* argv[])
{
int t=0;
t = findstr("the num the The,,THE the");
printf("%d",t);
return 0;
}

在字符串中找"the"的个数,在debug下是0,在release下结果为3,
在debug下单步跟踪,好像strncpy这步执行后,strncpy并未在最后加上'\0',导致后面的strcmp结果为不等,
而release下则正确,为什么呢?
...全文
131 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
东莞某某某 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icansaymyabc 的回复:]

debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。
[/Quote]
这位说对了 windows程序调试 里也讲到了
赵4老师 2011-08-12
  • 打赏
  • 举报
回复
strncpy(str_tmp,dst,3);
改为
strncpy(str_tmp,dst,3);str_tmp[3]=0;
即可。
赵4老师 2011-08-12
  • 打赏
  • 举报
回复
strncpy不负责在目标字符串的末尾加'\0'
至善者善之敌 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icansaymyabc 的回复:]
debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。
[/Quote]

++1
luciferisnotsatan 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icansaymyabc 的回复:]

debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。
[/Quote]
++
jernymy 2011-08-12
  • 打赏
  • 举报
回复
搂主要在malloc之后,做memset


char *str_tmp=(char *)malloc(4);
memset(str_tmp, 0, 4);


malloc的buffer为栈中数据,原有数据为清0的
AnYidan 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icansaymyabc 的回复:]
debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。
[/Quote]

学习了
shiweifu 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nightkids_008 的回复:]

引用 1 楼 icansaymyabc 的回复:
debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。

他解答了 ++1
[/Quote]

+1
nightkids_008 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icansaymyabc 的回复:]
debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。
[/Quote]
他解答了 ++1
icansaymyabc 2011-08-11
  • 打赏
  • 举报
回复
debug版的程序为了便于调试,会把你申请的空间全部用0x0c填充。而release版本不会做这件事,它会保留内存中原有的值。

在你的release版程序中,需要 '\0'的内存中刚好是'\0',并不代表你的程序是正确的。
而debug版中,需要 '\0'的内存中值是 0x0c,暴露了你的BUG。

69,368

社区成员

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

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