关于标准strcpy()的疑问

来源:百度知道 编辑:UC知道 时间:2024/09/25 09:34:36
许多书上有关标准strcpy()函数的定义为:
char *strcpy(char *strDest,const char *strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));
char *address=strDest;
while((*strDest++=*strSrc++)!='\0');
return address;
}
对于上面函数的疑问是:它定义的address是一个局部变量,返回局部变量不是会有危险吗?因为返回后局部变量会自动释放。是否应该用static char *address呢?
谢谢楼上两位的解答!
对于一楼的回答:1.我觉得可以用static char *address;虽然调用了strcpy,但是address=strDest;后每次都改变了address的值,所以返回的仍然是新的字符串首地址,不存在第二次调用返回第一次的地址值。
2我不知所云,3我知道是那样。
对于二楼的回答:
“strDest的首地址并不存在释放局部变量的问题”这句话也是不知所云。
我再补充解释一下:我的意思是如果不限定address是static,那么最后return address里的这个address是局部变量,返回它应该有危险的。因为有书中说如果指针型函数有返回值,则必须是外部或静态存储类别的变量的指针或数组指针,以保证调用函数能正确使用数据。

解释

定义的address是一个局部变量

定义address的目的只是为了保留参数 strDest的首地址
因为函数中完成复制的过程是通过移动strDest 指针完成的。

所以 strcpy 最后返回的是 address中保留的参数 strDest的首地址
并不存在释放局部变量的问题

strcpy 之所以要返回参数strDest的地址是为了便于书写链式表达式

char a[10] = {"123"};
char b[20];

strcat(strcpy(b, a), "456");

楼主对address中所保留指针的返回是不是有危险,
还是抱有怀疑,是因为对指针的概念还不是非常清楚

将strcpy做一个小变动:

char *strcpy(char *strDest,const char *strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));
char *address=strDest;
while((*address++=*strSrc++)!='\0');
return strDest;
}

楼主看看区别,现在返回的指针是不是有危险呢

如果 strcpy 什么都不做呢
char *strcpy(char *strDest,const char *strSrc)
{
return strDest;
}

返回局部变量释放后的野指针
int *fun(int a)
{
int *p;
int n[10];
p = n;
n[0] = 1;
n[2] = 2;

return p;
}
这个函数返回