char型指针与常量

Lingoesforstudy 2010-12-07 10:48:09

最近看C++常常遇到下面这种函数:

void set_name(const char *n); // 声明部分
·
·
·
void set_name(char *n)
{
int len=strlen(n)+1;
char *name=new char[len];
strcpy(name,n);
return name;
}

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

我不明白之处:

1.为什么每次给name申请的空间都要比传入的参数n所指向的字符串的长度strlen(n)大1;

2.为什么不直定义成下面这种形式:

void set_name(const char *n)
{
char *name;
name=n;
return name;


让返回一个指向传入参数的指针,这也能得到那个字符串啊。



...全文
365 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenjinghuan999 2011-02-02
  • 打赏
  • 举报
回复
+1为了存\0
strcpy为了以后如果修改了原字符串,你复制到的没有跟着变
HZ_1125 2011-01-07
  • 打赏
  • 举报
回复
很蛋疼的代码....void return ...
T0Ols 2011-01-07
  • 打赏
  • 举报
回复
因为留一个地方 存储 '\0';
nickowen 2011-01-07
  • 打赏
  • 举报
回复
帮住别人固然是好,但请要自己弄清楚再说,要不会误倒人的.
1.是为了那个'\0'
2.改成
char *set_name(const char *n)
{
char *name;
name=n;
return name;

从语法上说是可以的.但n和name指的是同一块内存.等于你没做任何处理(那你还传进来做什么)
并不会象有些人说的一个不确定的值,返回name就回出错.因为此时返回的是name所指的对象而不是name自己这个指针变量

xyy19920105 2011-01-07
  • 打赏
  • 举报
回复
差点看漏了 VOID 无返回值的函数类型 要写成char*set_name(char*name)const是不行的,因为我觉得有const必须赋初值才行,所以没必要用const
xyy19920105 2011-01-07
  • 打赏
  • 举报
回复
楼主那样应该也可以,字符串可以由地址直接输出,其他不行
xyy19920105 2011-01-07
  • 打赏
  • 举报
回复
不加一输出一串字符,因为没'\0' 加一输出一个字符串
mxy0226 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bravery36 的回复:]
1)字符串常以'\0'为结束符,strlen算出来的长度不包括'\0'
2)这类函数返回了和原串相同内容的另一个指针,而不是和原串指向相同的指针。也就是说就算以后n被delete掉了,返回的指针还能用。
[/Quote]

如果 char*n的最后一个字节的下一位不是"\0"怎么办,
我想最好在最后加个 name[len] = '\0'
a3155792 2011-01-06
  • 打赏
  • 举报
回复
这个很简单啊,strlen()函数计算字符串长度时候是以'\0'结尾的啊。所以楼主得考虑他的存在啊,
zhuywei123 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 houronghui 的回复:]
我有个疑问:name是一个局部变量,作用域在set_name这个函数内,出了这个函数就没有用了。
返回一个局部变量会不会有什么问题?
[/Quote]
你的疑问恰是问题的关键!

如果程序是:
char *set_name(char *n)
{
int len=strlen(n)+1;
char *name=new char[len];
strcpy(name,n);
return name;
}
name是动态分配的,即使出了定义它的函数也不会被释放,是可以返回的。

如果程序是:

char *set_name(const char *n)
{
char *name;
name=n;
return name;

name是定义的局部变量,存在栈上,出了定义它的函数即释放,是一个不确定的值,返回name就回出错。
sea_spray 2011-01-06
  • 打赏
  • 举报
回复
真是,楼主的程序里有个返回值,确实很是让人费解~~~~
liumu1209 2011-01-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cranium 的回复:]

你的第一个问题: 假设n代表字符串"hello"的话,n实际占用6字节空间,strlen(n)=5,因为strlen返回的长度不包括最后的null结束符,所以要分配一个能放下“hello”的内存空间,就需要strlen(n)+1。

第二个问题:其实这2种写法都不算标准。
先说他的写法,函数内部分配内存然后返回其指针,这样很容易让使用函数的人忘记释放内存。
你的写法虽然逻辑上可以,但是没……
[/Quote]
+1
这是一个非常糟糕的,也是一个莫明其妙的函数。
不过是一个拷贝函数罢了,居然要写的这么隐晦。
碎碎念 2011-01-01
  • 打赏
  • 举报
回复
如果这样写的话...
void set_name(const char *n)
{
char *name;
name=n;
return name;

函数运行结束时....name所指的空间的内容也没销毁了....所以一定要在堆上new一个空间...
lten1 2011-01-01
  • 打赏
  • 举报
回复
string要多留一个'\0'
hukui161 2011-01-01
  • 打赏
  • 举报
回复
过来JF。上面都说了。
lucky-lucky 2011-01-01
  • 打赏
  • 举报
回复
LZ可以测试一下你写的两个函数的返回值(即他们的指针)是否一样,
void set_name(const char *n)
{
char *name;
name=n;
return name;


这个返回的就是n的指针,所以你要修改返回的指针所指的内容的时候恰恰会改变(或许你根本不想改变)那个值

flysnowhite 2011-01-01
  • 打赏
  • 举报
回复
1、给字符串结束标识留个位置。
2、你那样做,name指针没有初始化,也就是说,指向一个不确定的内存空间,很容易出问题。
aliwayne 2011-01-01
  • 打赏
  • 举报
回复
飘过拿分!!
  • 打赏
  • 举报
回复
正解[Quote=引用 2 楼 bravery36 的回复:]

1)字符串常以'\0'为结束符,strlen算出来的长度不包括'\0'
2)这类函数返回了和原串相同内容的另一个指针,而不是和原串指向相同的指针。也就是说就算以后n被delete掉了,返回的指针还能用。
[/Quote]
a6d0m5i5n1tw 2011-01-01
  • 打赏
  • 举报
回复
上面说本来是要返回name的地址,但没有地址,返回的时候就有可能出错。
那该如何返回呢
加载更多回复(11)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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