依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

c中的返回指针的函数问题!

c中的返回指针的函数问题!

若一个函数返回一个参数,这个参数是个指针变量,如果存储的是个字符串如:
char  * test()  
{char *p ;
p="ab.c"
return(p);      }

如果显示可用
void main()
{
char *m;
m=test();
printf("%s\n",m)
}
这样没问题,但是如果调用类似流的函数会出现问题
如果

void main()
{
char *m;
FILE *fp;
m=test();
fp=fopen(m,"r");//在这有时会出现问题,提示找不到改文件(假如该文件夹存在ab.c这个文件)
}


大家说说这是啥问题?
另外,我的解决方式是在函数中带个参数

char  * test(char *s)  
{char *p ;
p="ab";
strcmp(s,p);
return(p);      }


void main()
{
char *m;
char *s;
FILE *fp;
m=test(s);
fp=fopen(s,"r");}
这样就能解决问题

c中的返回指针的函数问题!

:)大哥。你的m是文件名吗???

c中的返回指针的函数问题!

测试用,已经修改了,呵呵

c中的返回指针的函数问题!

羞愧,学艺不精,我还去man了一下strcmp()

c中的返回指针的函数问题!

返回调用函数中的指针,肯定错了,调用返回那是垃圾了

c中的返回指针的函数问题!

一般函数返回指针有以下几种情况:
1、处理后,返回调用参数的某个参数,这主要是为了方便某些连接函数或者打印显示的需要。
例如:char *func(char *str):该函数实际上返回的可能是处理后的参数str,这时候调用printf、strcmp的函数都比较方便了。

2、函数里的动态分配对象:调用者必须在外层予以释放空间。
例如:
     char *func(void)
       {
           char *p = malloc(128);
           
            ......
            return p;
       }

3、函数里的static对象。
4、某个全局对象。

c中的返回指针的函数问题!

char *p ;
p="ab.c"


这么写法安全吗??可靠吗???

c中的返回指针的函数问题!

乱七八糟

c中的返回指针的函数问题!

晕不知道你们搞什么呵呵

c中的返回指针的函数问题!

P是野指针。你代码有几个问题:
1。代码风格,注意缩进;
2。“ab.c”是一个字符串常量const char *,直接给char *是有潜在威胁的;
3。p没分配内存;
4。p定义在函数内,函数消亡他就不存在了。

c中的返回指针的函数问题!

faint,
LZ的代码没有错误,
那真是你运行出错的代码吗,
还是你自己精简过的.

这问题讨论过很多次了.

char* test()
{
      char* p ;
      p = "test.c" ;
return p ;
}

这样的写法是肯定没有问题的.

c中的返回指针的函数问题!

-->

晕倒
那这样的写法对不对呢.

int get_int()
{
    int i ;
    i = 7 ;
    return i ;
}

按照你的说法,i定义在函数里,函数消亡他就不存在了.
这句话本身没错.
但你错误理解了他的含义了.
j = get_int() ;
你难道能说j不等于7吗.

c中的返回指针的函数问题!

哎!与楼主的提问偏得越来越远

c中的返回指针的函数问题!

-->
你这个能解决问题纯属凑巧。
char *s 没分配空间就 m=test(s);

c中的返回指针的函数问题!

-->
这段代码看起来没什么问题,我在 RedHat 9上试了一下运行正常。
不知是否跟你的运行环境有关,或是其他代码有指针越界的情况造成的(你是单独运行这段代码时出错,还是跟其他代码一起运行时出错?)。

c中的返回指针的函数问题!

回复:unicorns
我只是说在这几个方面有问题,当时手上没有编译器,我也是提醒楼主从这几方面考虑。经过我的编译,代码是可以通过的。如果误导了楼主,请原谅:)

c中的返回指针的函数问题!

-->
return i语句返回的是i的一份拷贝,并不是i本身。函数退出时,i本来就不存在了,返回值是没问题,返回指向它的指针就不行了。

c中的返回指针的函数问题!

-->

[code]
char* test()
{
     char* p ;
    p = "test.c" ;
    return p ;
}
[/code]

char*本身就可以理解为一个整数,只不过这个整数代表的是地址而已.

我们可以写成这样
[code]
#include <stdio.h>;
#include <stdlib.h>;

unsigned long test()
{
        unsigned long p ;       
        p = (unsigned long)"test.c" ;
        return p ;
}

int main()
{
        char* name ;
        FILE* fp ;
        name = (char*)test() ;
       
        fp = fopen(name, "r") ;
        if (fp)
                printf("s!\n") ;
        else
                printf("f!\n") ;
}

[/code]

这样写你知道为什么没有错了吧.

c中的返回指针的函数问题!

-->
因为p是指向静态存储区,所以当他返回那个地址后是可行的,如果是指向动态存储区,就不行了。会自动释放,这也许是楼主说他的程序不能用的原因。可能楼主的程序中 ab.c是通过其他途径得来的。

posted on 2008-02-14 17:01 向左向右走 阅读(1854) 评论(0)  编辑 收藏 引用 所属分类: C/C++学习资料库

只有注册用户登录后才能发表评论。