+ -
当前位置:首页 → 问答吧 → 老师说得对吗?大家来看看

老师说得对吗?大家来看看

时间:2011-12-12

来源:互联网

老师说:返回值为指针的函数,其返回值应该是一个全局的指针变量(包括局部static指针变量)。

理由: 因为其他变量会被释放掉。。。

大家能帮我解释一下么?? 感谢大家了。

作者: cwj649956781   发布时间: 2011-12-12

准确地说,C/C++函数不能返回临时变量
char *test()
{
  char s[]="hello";
  return s; //这个有问题
}
char *test()
{
  char *s="hello";
  return s; //这个可以
}
char *test()
{
  static char s[]="hello";
  return s; //这个也可以
}

作者: keiy   发布时间: 2011-12-12

那个老师说的对。

作者: quwei197874   发布时间: 2011-12-12

看不懂

作者: a28574489   发布时间: 2011-12-12

觉得这个说的有道理...
引用 1 楼 keiy 的回复:

准确地说,C/C++函数不能返回临时变量
char *test()
{
char s[]="hello";
return s; //这个有问题
}
char *test()
{
char *s="hello";
return s; //这个可以
}
char *test()
{
static char s[]="hello";
return……

作者: Cs1275   发布时间: 2011-12-12

++
引用 1 楼 keiy 的回复:

准确地说,C/C++函数不能返回临时变量
char *test()
{
char s[]="hello";
return s; //这个有问题
}
char *test()
{
char *s="hello";
return s; //这个可以
}
char *test()
{
static char s[]="hello";
return……

作者: Cs1275   发布时间: 2011-12-12

你們老師說對一半,若該指針為 malloc / new ,放在 heap 上,
則可返回其指針,否則必須宣告為全局變量。

理由為變量生命週期之問題
C/C++ code

#define SIZE 200
char* func1(unsigned size)
{
    int i;
    char string[SIZE+1]; // string 在 sub-function 裡開始它的生命
    for(i=0; i<SIZE; ++i) string[i]='a';
    string[SIZE]='\0';
    return string; // string 在 sub-function 裡結束它的生命
}



上述當 func1 結束後,string 生命週期結束,
作業系統回收了一開始為它配置的 SIZE + 1 個空間之內存。

所謂的回收,並不代表在該空間會馬上清空為 0 或設為其他常量,
而是由作業系統標示,目前這段空間沒有變量可使用,
其他變量要使用時,這段空間可為其使用之考量。
故返回後若 caller 再強制使用時,未必會馬上發生錯誤。
( SIZE 小的話幾乎不會有誤,但此舉實為任何 coder 所弊)

把上面的 func1 寫完整
C/C++ code

#include <stdio.h>

#define SIZE 200
char* func1()
{
    int i;
    char string[SIZE+1]; // string 在 sub-function 裡開始它的生命
    for(i=0; i<SIZE; ++i) string[i]='a';
    string[SIZE]='\0';
    return string; // string 在 sub-function 裡結束它的生命
}

int main()
{
    char* p = func1();
    puts(p);
    return 0;
}

// output = aaaaaaaa 8
// 結果不一定,前面幾個 bytes 結果都還好,後面必會失敗。
// 但可確定的是,此法確實非明智之舉,為聚所弊。



然而若將該指標變量宣告為 global,其生命週期乃從程序開始一直到程序結束,
這段時間該指標 (array) 所佔用之內存並不會被收回;

另一開始所說之 malloc / new ,放到 heap 內,
原因乃一個 malloc / new 必須對應一個 free / delete,
若沒對應,則變量之資料必存在於 heap 內存內,不會被自動收回,
唯此時內存管理必須做好,否則易發生 memory leak 現象。

作者: goodbye_mylove   发布时间: 2011-12-12

補一下 return pointer on heap 作法

C/C++ code

#include <stdio.h>
#include <malloc.h>

char* func1(const int SIZE)
{
    char* ptr = (char*)malloc(SIZE); // allocate memory
    memset(ptr, 'a', SIZE-1);
    ptr[SIZE-1]='\0';
    return ptr; // return heap
}

int main()
{
    char* ptr = func1(10);
    puts(ptr);
    free(ptr); // release memory
    return 0;
}



這段 code 是可行的。

作者: goodbye_mylove   发布时间: 2011-12-12

只能说你的老师说的不全,比如返回的指针是参数的情况,这种情况一般是对于链式操作非常有用的.
顺便说一句在函数内动态分配内存然后作为返回值是个非常不好的习惯,也许你会说:我一会记得释放的,
但是我想说,你考虑过别人了吗?

作者: jumpjumpYE   发布时间: 2011-12-12

感觉楼主最好换一个老师。

作者: taodm   发布时间: 2011-12-12

#6,#7都没错,所以我说的是:准确地说,C/C++函数不能返回临时变量(临时变量是在栈上的)
老师讲的是通常情况下,因为通常情况下,一般不会用在函数中malloc后返回给主函数用的
这会使程序结构变得复杂,如果主函数或其它地方没有释放该指针的话,可能导致内存泄漏,这个是不推荐使用的

作者: keiy   发布时间: 2011-12-12