函数要返回一个字符串,该怎么为其分配空间

oyd 2003-03-19 09:23:00
假设我现在要实现这么一个功能
一个数组char * a[2]={"aaa","bbb"}
而函数func(char **)要求把数组中的字符串拼在一起
返回"aaabbb"

如果我这么写
char * func(char *a[])
{
int n=strlen(a[1])+strlen(a[0]);
char *p=new char(0);
strcat(p,a[0]);
strcat(p,a[1]);

return p;
}

void main()
{
char *a[2]={"aaa","bbb"};
char *p=func(a);
printf("%s\n",p);

}

它的输出是aaabbb
但是很疑惑,这样new出来的空间没有delete,会不会存在内存泄漏.
各位有没有好的实现方法
...全文
57 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyd 2003-03-20
  • 打赏
  • 举报
回复
谢谢大家
merlinran 2003-03-20
  • 打赏
  • 举报
回复
在C里面的惯用法,应该是由函数负责分配内存,用户负责释放。
如果用户没有释放内存,只会出现内存泄漏。
如果用户提供了不够大的内存,会造成越界,情况更严重。
bauhaus 2003-03-20
  • 打赏
  • 举报
回复
同意楼上,其实怎么做大家都知道,但是主要是个习惯问题,好的习惯是慢慢养成的,对于不需要长时间运行的程序来说,少量的内存泄漏并不会造成特别大的影响,但是如果一段习惯不好的代码用在大型的需要长时间运行的程序中后果是很严重的
Zark 2003-03-20
  • 打赏
  • 举报
回复
在一个函数里面用new分配的内存,在函数返回后是一样可以释放掉的.

你的函数可以是这样
char * func(char *a[])
{
int n=strlen(a[1])+strlen(a[0]);
char *p=new char(0);
strcat(p,a[0]);
strcat(p,a[1]);

return p;
}

void main()
{
char *a[2]={"aaa","bbb"};
char *p=func(a);
printf("%s\n",p);
delete []p;
}
当然这种解决方法不是太好的,因为对于一个func()函数的使用者来说,他不一定能够知道他必须替你擦屁股.通常的方法是谁的屁股谁去擦.也就是

int func(char* szBuf,int nLen,char *a[])
{
if(!szBuf || nLen<1)
return 0;

*szBuf='\0';
int n=strlen(a[1])+strlen(a[0]);
if(n>nLen)
return 0;
strcat(szBuf,a[0]);
strcat(szBuf,a[1]);

return 1;
}

void main()
{
char *a[2]={"aaa","bbb"};
char *p=new char [256];
if(func(p,256,a))
printf("%s\n",p);
else
printf("Error.\n");
delete []p;
}

至于char *asctime( const struct tm *timeptr )的问题,那是因为它使用static变量.


char *asctime( const struct tm *timeptr )
{
static char szMsg[1024];
....
....
sprintf(szMsg,"I do know the reason.");
return szMsg;
}
oyd 2003-03-19
  • 打赏
  • 举报
回复
现在我的问题就是
在一个函数里面用new分配的内存,在函数返回后怎么释放掉
像很多字符转换用的库函数,他们是怎么做的呢?
如下面的库函数,输入一个时间结构体,返回一个字符串。
char *asctime( const struct tm *timeptr );
cxjddd 2003-03-19
  • 打赏
  • 举报
回复
楼上说的可有危险了,这个函数是不会给你自动分配内存的。
oyd 2003-03-19
  • 打赏
  • 举报
回复
lwzlemon(stone) 的方法好像不可行,char *p="";这一句,p所指的内存是不可写的,所以p不能再用于strcat(p,a[0])中,我试了,程序会崩溃
maurice1983 2003-03-19
  • 打赏
  • 举报
回复
不需要你写了,有现成的东西给你用:strcat(char*, const char*).它的功能是把后一个字符串加到前一个字符串的后面,并返回前一个字符串的地址!
lwzlemon 2003-03-19
  • 打赏
  • 举报
回复
如果怕内存泄漏,就不用new好了,以下是一种方法,通过测试.
#include<iostream>
#include<string>
using namespace std;
char * func(char *a[])
{
int n=strlen(a[1])+strlen(a[0]);
char *p="";
strcat(p,a[0]);
strcat(p,a[1]);

return p;
}

void main()
{
char *a[2]={"aaa","bbb"};
char *p=func(a);
printf("%s\n",p);

}
yuanhen 2003-03-19
  • 打赏
  • 举报
回复
最好还是用STL。
yuanhen 2003-03-19
  • 打赏
  • 举报
回复

在main的最后加一个
delete []p;
mxic 2003-03-19
  • 打赏
  • 举报
回复
把P new在函数func外。

70,032

社区成员

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

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