老师说得对吗?大家来看看
时间:2011-12-12
来源:互联网
理由: 因为其他变量会被释放掉。。。
大家能帮我解释一下么?? 感谢大家了。
作者: cwj649956781 发布时间: 2011-12-12
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
准确地说,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
准确地说,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
則可返回其指針,否則必須宣告為全局變量。
理由為變量生命週期之問題
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
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
老师讲的是通常情况下,因为通常情况下,一般不会用在函数中malloc后返回给主函数用的
这会使程序结构变得复杂,如果主函数或其它地方没有释放该指针的话,可能导致内存泄漏,这个是不推荐使用的
作者: keiy 发布时间: 2011-12-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28