读书人

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

发布时间: 2012-02-11 09:51:34 作者: rapoo

一个经典的指针返回问题

#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 ";
}

读书人网 >C语言

热点推荐