C语言返回值问题

a昊a 2017-08-13 08:52:13
二话不说先上代码
一段测试代码

#include <stdio.h>
#include <stdlib.h>
int * test(void);
int main(void)
{
int * pointer;
pointer = test();
for(int i = 0; i < 10; i ++)
printf("%d ",pointer[i]);
system("pause");
return 0 ;
}
int * test(void)
{
int count[10];
for(int i = 1; i <= 10; i ++)
count[i-1] = i;
for(int j = 0; j < 10; j ++)
printf("%d ",count[j]);
return count;
}

下面是警告
20 2 E:\Work\C语言\cfile\cpptest.c [Warning] function returns address of local variable [-Wreturn-local-addr]
函数返回局部变量地址,为什么?虽说count是局部变量,但是不是应该可以返回吗?
...全文
597 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-08-21
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
x_xx_xxx_xxxx 2017-08-21
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
路漫漫其修远兮,吾将上下而求索
qq_39913959 2017-08-20
  • 打赏
  • 举报
回复
返回的是指向栈内存指针,函数调用结束,栈内存会被释放,而在主函数访问该片内存,是为初始化的,因此出错
赵4老师 2017-08-15
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
a昊a 2017-08-15
  • 打赏
  • 举报
回复
引用 6 楼 自信男孩的回复:
这也算是经典问题了,返回局部变量是未定义行为。 了解这个问题的原因,需要学习栈的申请和释放原理;
谢谢,我刚学C语言,在看c primer plus 对栈和堆的部分很少,也快看完了有什么关于这方面的书介绍吗?
「已注销」 2017-08-15
  • 打赏
  • 举报
回复
不是不可返回,返回一个在函数里面定义的局部变量,如果返回的是指针或者数组。正确的做法是先申请内存,否则会出错。 申请内存方法有malloc(c语言)和new(c++)两种。
jdgdf566 2017-08-14
  • 打赏
  • 举报
回复
改成

return &count;
jdgdf566 2017-08-14
  • 打赏
  • 举报
回复
改成
return count;
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
xiaohuh421 2017-08-14
  • 打赏
  • 举报
回复
局部变量可以返回, 但是会出现什么结果, 就不知道了
自信男孩 2017-08-14
  • 打赏
  • 举报
回复
这也算是经典问题了,返回局部变量是未定义行为。 了解这个问题的原因,需要学习栈的申请和释放原理;
jena_wy 2017-08-14
  • 打赏
  • 举报
回复
返回局部变量,引起的问题
棉猴 2017-08-13
  • 打赏
  • 举报
回复
引用 2 楼 JILAU_WHO_AM_I_Q234 的回复:
十分感谢,对了你这个是什么软件
Visual Studio 2015
赵4老师 2017-08-13
  • 打赏
  • 举报
回复
栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,……
a昊a 2017-08-13
  • 打赏
  • 举报
回复
十分感谢,对了你这个是什么软件
棉猴 2017-08-13
  • 打赏
  • 举报
回复
1 局部变量
在函数中定义的变量的名字只位于函数的作用域中:这些名字只在函数体中可见。函数中的局部变量当函数的执行结束时撤销。当函数结束时,会释放它的局部存储空间。在函数结束时,函数体内的局部变量都不能再访问了。
2 函数返回值
函数的返回值用于初始化在调用函数处创建的临时对象。在调用函数的地方会将函数返回值复制给临时对象。
3 问题分析
当执行text()函数时,数组count的地址是0x00B5F888,此时该地址的内容是

所以此时的输出为1、2、3.....10
当text()函数执行完毕后,因为count数组是局部变量,该变量会被释放,即其地址中的内容会清空。此时主函数中pointer的变量值虽然还是0x00B5F888,但该地址的内容已经被释放

所以此时的输出是一些很大的负数
因此,对于函数来说

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧