函数的返回值

本文探讨了函数返回值的安全性问题,介绍了如何通过定义全局变量、静态变量、堆区变量及常量来避免变量过早销毁导致的错误。并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       函数的返回值,必须保证在使用时,他所对应的变量值不应被销毁。防止变量被销毁的方式:

1.定义全局变量;

2.定义静态变量;

3.在堆区定义变量;

4.定义在常量区,如字符串常量。

        注:静态全局变量只在当前文件中可用,全局变量在其他文件中也可用,需要用extern声明;二者如果没有手动初始化,则默认由编译器初始化为0。

 

具体分析:

例1:

char* func()

{

    char *p = "test"; //字符串常量,存储于常量区,退出时不受影响

    return p;   // 返回指向常量字符串的指针,可行

}

 

例2:

char* func()

{

    char str[] = "test"; //字符串局部变量,退出时销毁

    return str; // 返回局部字符串的指针,将引发未知错误

}

解决办法就是将字符串str声明为static或在堆内定义变量,如例3。

 

例3:

char* func()

{

    char *str = (char *)malloc(sizeof(char) * BUFFER_SIZE);

    strcpy(str, "test");

    return str;

}

需要注意的问题是防止出现内存泄露,函数调用完后需要手动释放内存,free(temp);

 

例4:

int* Count(char *s)

{

int count[100]={1,2,3};//局部变量

   return count;

}

    当把数组名返回时,实际上是返回了数组的首地址,后续继续使用该地址指向的内存。如果数组为局部变量,该段地址在退出函数后,会被释放,并可能被系统做其它用途,这样再继续访问该段地址就会引起不可预知错误。所以对于局部数组名是不可以返回的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值