回 帖 发 新 帖 刷新版面

主题:一个老是糊涂的指针问题

char* DoSomething()
{
    char str[16]="asdf";  
    return str;
}  
int main()
{

    char *str = new char[16];
    //str = *DoSomething();
    str = DoSomething();
    cout << str;
}

在编译上,它是不会报错的,但在结果上,它输出的是乱码。有没有那位大大好心和我详细解说下,在书上看了好多,可感觉越看越乱。

回复列表 (共13个回复)

沙发

不报错的话,换编译器,因为 str = *DoSomething() 明显语法错误

而对于你的代码逻辑正确性,我是不会说它是一坨屎的,因为这太贬低屎了

板凳

char* DoSomething()
{
    char str[16]="asdf";  
    return str;
}  
这里返回的str为局部变量,在栈上存储的,出了这个函数就会销毁的。所以外部打印一般都不会是你需要的

3 楼


。。。丢大了!没有那个*,加那个是我想看看用char**DoSomeThing(),这个函数能不能用

4 楼


如果是局部的原因的话,那为什么下面这个函数是可以返回,并被接收的呢
int doanything()
{
    int a = 5;
    return a;
}

5 楼

[em10]

6 楼


返回一个值和反回一个地址引用是不一样的

7 楼

1,你把局部变量的地址return
2,你new了一些数据没管

^_^

8 楼

在C语言的版块你怎么发C++的程序?
我在偶然的情况下发现这样可以引用局部变量的地址:

[code=c]
#include <stdio.h>
char * DoSomething()
{
    char s[]="abcdefg";
    return s;
}

int main()
{
   char *sp[1];
   void print (char *);
   sp[0]=DoSomething() ;
   print(sp[0]);
}

void print(char *s)
{
    printf("The local string is %s",s);
}

[/code]
编译通过,虽然会有“warning: function returns address of local variable”的警告,但执行起来没问题。用C++也是可以的:
[code=c]
#include <iostream>

char* DoSomething()
{
    char str[16]="asdf";
    return str;
}
void print(char *s)
{
    std::cout<<"The local string is "<<s;
}
int main()
{
    char *str[1];
    str[0] = DoSomething();
    print(str[0]);
}

[/code]
编译时同样也会有“warning: function returns address of local variable”的警告,但执行OK。
在main函数里直接引用局部地址变量会出错的,只有通过另一个函数来打印出,而且要用指针数组来存取局部地址,具体原因我也不清楚。

9 楼

回8楼,我也一样求解

10 楼

如果Dosomething()在堆中分配一块内存并初始化一个字符串并返回它的指针又有何不可?

我来回复

您尚未登录,请登录后再回复。点此登录或注册