这个程序为什么没有出现内存泄露呢?

liuyang1943 2010-05-13 02:09:11
// gKeyParse.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <assert.h>
#include <iostream>
using namespace std;
int gKeyParse(char *buf,char *key,char *value)
{
int ret=0;
do
{
if(!buf||!key||!value)
{
ret=-1;
break;
}
char *p=NULL;
if(!(p=strstr(buf,key)))
{
ret=-2;
break;
}

p=p+strlen(key);

while(*p==0x20||*p==':'||*p=='=')
{
p++;
}
while(*p!=0x20&&*p!='\r'&&*p!='\n'&&(value+1))
{

*value++=*p++;

}
*value='\0';
}while(0);
return ret;

}


int _tmain(int argc, _TCHAR* argv[])
{
char buf[100]="This is a key : hello !";
char value[2];
char key[20]="This is a key";
memset(value,0,sizeof(value));

int ret=gKeyParse(buf,key,value);
printf("%s\n",value);
//cout<<value<<endl;
getchar();


return ret;
}



value[2]中保存了超出2个字符的数据,为什么还能正确运行?疑惑。。。。
...全文
109 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyang1943 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]

楼上这句是复制的吧,我看到很多次你都是这样的回复,一字不差,不过说的在理
赵4老师 2010-05-13
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
肥嘟嘟肉呼呼 2010-05-13
  • 打赏
  • 举报
回复
不是内存泄露啊
暗黑帝国 2010-05-13
  • 打赏
  • 举报
回复
楼主的人品真好,这样也不挂!
你把getchar去掉看看。
hunter103 2010-05-13
  • 打赏
  • 举报
回复
value 越界了,很危险的有可能让程序挂掉。。。

-----------------------------

做为函数的形参时数组和指针是等价的.所以value 能输出hello...
liuyang1943 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]
那换java语言。
[/Quote]
java能访问内存吗?我一直以为不能呢。。。
taodm 2010-05-13
  • 打赏
  • 举报
回复
那换java语言。
liuyang1943 2010-05-13
  • 打赏
  • 举报
回复
那我换个问法:
while(*p!=0x20&&*p!='\r'&&*p!='\n'&&(value+1))

上面这句最后一个&&是想判断如果value的下一个字符地址为空,则不复制数据,但运行结果显示并没达到我想要的效果,value[2]中最后一个字符地址的下一个地址看来并不为空,那想要达到我想要的结果应该怎么改呢?
冻结 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuyang1943 的回复:]
可我运行多次还是这样啊,要这样的话我该怎么调试我防止访问越界的语句是否有作用呢?也就是
while(*p!=0x20&&*p!='\r'&&*p!='\n'&&(value+1))
上面这句中的&&(value+1)我是用来防止数据泄露的,要这样还怎么调试啊。。。
[/Quote]

因为你访问到的越界数据,还可以用。

另:这不是数据泄露的问题。
liuyang1943 2010-05-13
  • 打赏
  • 举报
回复
大家可以试试上面的程序,打印value数组理论上只能打印出一个字符吧,带结束符的话,可运行时能完整地打印出hello字符串。。。这是为什么呢
liuyang1943 2010-05-13
  • 打赏
  • 举报
回复
可我运行多次还是这样啊,要这样的话我该怎么调试我防止访问越界的语句是否有作用呢?也就是
while(*p!=0x20&&*p!='\r'&&*p!='\n'&&(value+1))
上面这句中的&&(value+1)我是用来防止数据泄露的,要这样还怎么调试啊。。。
冻结 2010-05-13
  • 打赏
  • 举报
回复
C/C++ 数组不访问,不判断访问越界。
你越界了,他不告诉你,
直到你访问到的越界数据,不合适时,
基本上,他会毫不留情的将你的程序弄死了。

所以,不要越界。
taodm 2010-05-13
  • 打赏
  • 举报
回复
因为你人品好。
但是,一个人不可能一直人品好,出来混迟早要还的。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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