有高手给我指出下面的错误所在;谢谢!

royke 2009-06-10 09:39:34
char* GetName(char *pNames)
{
char *p = new char[20];
strcpy(p, pNames);
return p;
}

此处是不是分配多余内存错误 char *p = new char[20];
...全文
52 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx_616_at_yeah_net 2009-06-10
  • 打赏
  • 举报
回复



char* GetName(char *pNames)
{
char *p = new char[20]; // pNames字符串可能会大于20, 如果pNames字符串小于20就没有问题
strcpy(p, pNames);
return p;
}

// 没有 释放 new char[20]
// 不再需要的时候, 要delete返回的char*


/////////////////////////////////////////////////////

// 可以改成这样

char* GetName(char *pNames)
{
char *p = new char[strlen(pNames)+1];
strcpy(p, pNames);
return p;
}

// 使用后, delete返回的char*

/////////////////////////////////////////////////////

// 如果不需要改变pNames字符串, 可以这么写

char* GetName(char *pNames)
{
return pNames;
}

/////////////////////////////////////////////////////

// 如果需要改变pNames字符串, 可以这么写

char* GetName(char *pNames)
{
static char p[32768]; // 一般的名字不会大于32768

if(pNames >= 32768)
return NULL;

return strcpy(p, pNames);
}

huntjap 2009-06-10
  • 打赏
  • 举报
回复
char* GetName(char *pNames)
{
char *p = new char[20];
strcpy(p, pNames);
return p;
}
-------------------
这种做法不好,因为在函数里面申请的内存,要在外面调用点释放。

不过pNames里面本身就是name的话没必要这么做啊。

外边直接用pNames就可以了
amossavez 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 royke 的回复:]
如果是在不越界的情况下
char a[5]="abcd"
char *p = GetName(...)

cout < < *p < <endl;应该只会输出第一个字母吧;a
...
delete[] p;

GetName(...) 是不是只返回CHAR数组的第一个字母的地址啊
[/Quote]
是这样的!!
jhony_lee 2009-06-10
  • 打赏
  • 举报
回复
用strncpy()吧
royke 2009-06-10
  • 打赏
  • 举报
回复
如果是在不越界的情况下
char a[5]="abcd"
char *p = GetName(...)

cout<< *p <<endl;应该只会输出第一个字母吧;a
...
delete[] p;

GetName(...) 是不是只返回CHAR数组的第一个字母的地址啊
GaA_Ra 2009-06-10
  • 打赏
  • 举报
回复
没有对pNames进行长度检查

可以用strncpy;
  • 打赏
  • 举报
回复
第一点,我在前面说了。
第2点, 你的deleete只能在外部调用了,容易忘记,这也是个问题吧
royke 2009-06-10
  • 打赏
  • 举报
回复
具体的题目 指出下列函数的几个错误和不对的地方,并说出为什么。
char* GetName(char *pNames)
{
char *p = new char[20];
strcpy(p, pNames);
return p;
}
licry01 2009-06-10
  • 打赏
  • 举报
回复
具体什么错误提示啊?
如果pNames的串长于19字节, 就是内存越界, 如果不是, 那就是p没有进行0的初始化.
char* GetName(char *pNames)
{
char *p = new char[20];
memset(p, 0, 20 * sizeof(char));
strcpy(p, pNames);
return p;
}
royke 2009-06-10
  • 打赏
  • 举报
回复
问题是不是 char *p = new char[20]; 分配内存不合理的问题啊
zzzzz_12345 2009-06-10
  • 打赏
  • 举报
回复
有new
就必须有delete
「已注销」 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 BHLT_US 的回复:]
问题是不是 分配给P的内存 随着函数GetName的执行结束而结束了.
[/Quote]
不是。
你需要自己delete,比如:
char *p = GetName(...)
...
delete[] p;
BHLT_US 2009-06-10
  • 打赏
  • 举报
回复
问题是不是 分配给P的内存 随着函数GetName的执行结束而结束了.
  • 打赏
  • 举报
回复
报错了吗?
除非pNames的串长于19字节

65,211

社区成员

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

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