函数返回 局部变量问题
来源:互联网 发布:二次元腐女软件 编辑:程序博客网 时间:2024/06/05 12:43
函数返回 局部变量问题
#include <string.h>
char* get_str(void)
{
char* str = "abcd";
return str;
}
int main(int argc, char* argv[])
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
上述代码中,str是局部变量,函数返回后应该释放掉了,但为什么get_str返回后,还能正常输出呢?
阿四知道CU网站的地址。
阿三打电话给(call)阿四,“阿四,告诉我CU网站的地址”
阿四告诉阿三CU网站的地址后就跑掉了,阿四不见了,但CU网站还在。
阿三知道了CU网站的地址,也就找到了CU网站。
1.sizeof(s),得出的长度不同。
对于字符串得到的是指针类型的长度(为4)。
对于字符数组得到的是字符数组的长度。
2。char* s=”hello”;
s[0]='a';//wrong!运行时显示为“段错误”。
字符数组是可以修改的。
3。作为返回值时不同。
char* test(){
char ch[5]={'h','i'};//gcc 会警告:返回局部变量。
return ch;
}
这个函数是错误的,因为字符数组ch是局部变量,当test调用结束是占用的空间将被释放。
改为:static char ch[5]={'h','i'};
或: char* ch=”hi”;
就可以了。
4。声明外部变量时,字符数组和字符串为不同类型。
File1.中:char version[]=”2.12”;
File2. : char* version=”2.12”;
File3. : extern char* version;
实际上,File3中version只能引用File2中的值,而引用File1中的 version时导致类型冲突。
————————————————————————————————————————————
局部变量里面还得分为自动还是静态,两者结果是不同的,得分开描述。
数组是不能作为函数的返回值的,原因是数组名是一个不可修改的左值,例如这样的代码是非法的:
int func( void )[5];
返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。例如:
int* func( void )
{
static int a[10];
........
return a;
}
局部变量也分局部自动变量和局部静态变量,由于c返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。例如:
int func()
{
int a;
....
return a; //允许
}
int * func()
{
int a;
....
return &a; //无意义,不应该这样做
}
局部指针跟上面所述的局部变量一样。可以返回一个局部指针的值,也可以返回一个局部静态指针的地址,但不应该返回一个局部自动指针的地址。
——————————————————————————————————————————————————————————
局部指针的话,通常人都认为指向的局部变量失效,那该地址存的是垃圾值,其实不然,系统要在接到你要操作这个内存的指令后才会把它清0,它并不是立刻清0,就好比文件一样,并不是接到指令立刻把文件全清0,只是标记告诉系统这个空间可用,文件一般是在的。
数组也是一样,下面有个小实例,第一个能正常输入,第二个则不行,因为在它之前操作了这块内存,操作了这块内存。
- C/C++ code
- #include "stdafx.h"char * Cstr(void){ char a[10] = "like"; return a; }int main(void) { char *a=Cstr(); printf("%c/n",*(a+1)); printf("%c/n",*(a+1)); return 0; }————————————————————————————————————————————————
局部变量:如果是基本变量,可以直接返回;如果是自定义变量,基本都是使用指针参数带出。
- int Sum( int a, int b ) // 基本变量没什么问题。{ return (a+b);}int DoSomething( const struct MyStruct * pParamIn1, const struct MyStruct * pParamIn2, struct MyStruct * pParamOut ){ // 在这里处理pParamIn1和pParamIn2指向的结构体,将结果保存到pParamOut指向的结构体中 // 带出函数,返回值只表示函数处理成功还是失败以及可能的失败原因}
局部指针:如果指针指向的内存是在函数内部申请的,基本不干返回指针这种事,做这种事情很有可能是在给自己找麻烦,多数做的都是在可以释放的地方申请好内存,通过指针传递进函数,申请和释放都在同一函数中。- void ToBeCalledByFun( SomeType * pParam ) // 被调用函数不申请堆内存{ // Do something to *pParam}void Fun( /*some parameters*/ ){ SomeType * pCallMem = (SomeType *)malloc( sizeof(SomeType) ); // 内存申请放在free的同一个函数里 ToBeCalledByFun( pCallMem ); // Do something free( pCallMem ); pCallMem = NULL;}
局部数组:我相信没什么人想返回这个东西。
- 函数返回 局部变量问题
- 函数返回局部变量问题
- 函数返回 局部变量问题
- 函数返回 局部变量问题
- 函数返回局部变量问题
- 返回函数局部变量的问题
- 09-01函数返回局部变量问题
- 函数返回局部变量的一些问题
- 函数返回局部变量的问题
- 函数返回局部变量 的问题
- 关于函数返回局部变量的问题
- 函数返回局部变量
- 函数返回局部变量
- 函数返回局部变量
- 函数返回局部变量
- 函数返回局部变量
- 函数返回局部变量
- 函数返回局部变量
- socket网络编程实现文件从服务器端到客户端的传输
- 要做的事情(给自己做个备忘)
- ORACLE小白札記
- WPF线程模型
- hudson+maven+svn配置详细说明--一jdk的安装
- 函数返回 局部变量问题
- 等你,执手渡流年(七夕)
- platform_driver平台驱动注册和注销过程
- 数学公式——两点间的距离
- 「离散数学」 打印任意命题公示的真值表和主范式
- 简单的单元测试
- 集合复习
- 判断类是否实现了某方法 —— respondsToSelector
- 注解