首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个经典的指针返回有关问题

2012-02-11 
一个经典的指针返回问题 #includestdio.h#includestring.hchar*GetString(char*String){char*Str1cha

一个经典的指针返回问题

#include   <stdio.h>
#include   <string.h>
char   *GetString(char   *String)
{
char   *Str1   ;
char   *Str2   ;
char   Str[1024];

Str[0]   =   0;
Str1   =   strstr(String,   "b ");
if   (Str1   !=   NULL)
{
Str1++;
Str2   =   strstr(Str1,   "c ");
if   (Str2   !=   NULL)
{
strcpy(Str,   Str1);
}
}
return   (char*)Str;
}
int   main()
{
        char   strq[5]   =   "abcd\0 ";
printf( "%s\n ",GetString(strq));
return   0;
}

这返回局部指针为什么是错的?能帮忙解释一下么?
而且错误的概率有多少?
谢谢了.

[解决办法]
局部对象建立
于函数的运行栈,函数结束时栈退出,销毁对象,
所以返局部对象的指针在函数执行之后指向一块无效内存,错误概率可想而知
[解决办法]
char Str[1024]; //你的这个数组是在堆栈中分配空间的,
//函数调用返回之后,空间自动释放,你返回的指针指向了已经
释放的内存空间,一旦这个内存空间被其他程序占用,你在使用这个指针
就会造成未定义的行为.
请参考(effective c++ 条款29: 避免返回内部数据的句柄)

[解决办法]
没有什么概率可言
我可以说这段程序能够正确执行(忽略 "abcd\0 "的问题)的概率还是有的,只要栈空间的内容没有被修改过。

但是不能因为有成功执行的概率就这样做,因为这种做法从根本上来说就是不对的


[解决办法]
你在找到‘c '后,直接返回Str1或Str2,按你个人的意思返回需要的指针。
为什么还要做拷贝呢?要不,就动态分配一段空间,不过最后要记得释放。
[解决办法]
建议你看一下《C专家编程》再开始写程序,这样效率会高很多,至少不会被这些errors弄的不知所措
[解决办法]
可以用字符串常量给一个char*赋值,但是通过指针去修改字符串常量将导致一个运行时错误
例如:
char* temp = "aaaaa "; //正确
temp[2] = 'b '; //错误

如果我们希望一个字符串被修改,就必须将它复制到一个字符数组中
例如:
char temp[] = "aaaaaaaa ";
temp[2] = 'b ';

由于字符串常量是静态分配的,所以让函数返回字符串常量是正确的
例如:
const char* ErrorMessage()
{
return "Error ";
}

热点排行