c语言 用指针传递函数返回值总是失败

weixin_40101242 2018-10-10 09:45:45
代码如下:
#include <stdio.h>

int *create()
{
int a[8] = { 1, 2, 3, 5, 2, 3, 5, 6 };
int i;
for (i = 0; i < 8; i++)
{
printf("%hd\n", a[i]);
}

return &a;//返回得到的整型数组的指针。
}


void main()
{
int i;
int *b;
b = create();
for (i = 0; i < 8; i++)
{
printf("%hd\n", b[i]);
}
system("pause");
}

运行结果如下:
...全文
1181 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
BrokenGeeker 2018-10-16
  • 打赏
  • 举报
回复
引用 4 楼 Slzde_sub的回复:
[quote=引用 3 楼 adlay 的回复:]
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.



。。。为什么我认为这程序就不该被编译成功,本身就是错误的返回类型[/quote] 两个问题都存在
蓝鲸灵 2018-10-16
  • 打赏
  • 举报
回复
引用 43 楼 蓝鲸灵的回复:
声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值时一个常量,指向这段空间的起始位置。 数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以可以认为程序没有给a分配空间,数组名只是代表了那个数组空间;与指针不一样,指针指向一块空间,同时指针本身也存储在某个空间;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异,VC是合法的。
http://m.blog.chinaunix.net/uid-10221131-id-350168.html 具体可以看这里
蓝鲸灵 2018-10-16
  • 打赏
  • 举报
回复
声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值时一个常量,指向这段空间的起始位置。 数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以可以认为程序没有给a分配空间,数组名只是代表了那个数组空间;与指针不一样,指针指向一块空间,同时指针本身也存储在某个空间;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异,VC是合法的。
蓝鲸灵 2018-10-16
  • 打赏
  • 举报
回复
为什么没人提到对于return &a,c++编译器报错是无法从int*[8]转换成int*呢
andromeda2018 2018-10-14
  • 打赏
  • 举报
回复
函数内的局部变量返回以后函数栈会被回收,返回局部变量指针就会出现未定义行为。
IamOrthoPole 2018-10-13
  • 打赏
  • 举报
回复
函数内部创建的堆变量最好不要返回,不然使用者可能不知道这是堆变量从而忘记delete
蛮月笙 2018-10-12
  • 打赏
  • 举报
回复
局部变量离开作用域就失效了,返回的指针应该是无效的
gy5461 2018-10-12
  • 打赏
  • 举报
回复
#include<cstdlib> #include<cstdio> #include<cstring> int* create() { int* a = new int[8]; int b[8] = { 1, 2, 3, 5, 2, 3, 5, 6 }; memcpy(a, b, sizeof(b)); int i; for (i = 0; i < 8; i++) { printf("%hd\n", a[i]); } return a;//返回得到的整型数组的指针。 } int main() { int i; int* b; b = create(); for (i = 0; i < 8; i++) { printf("%hd\n", b[i]); } delete b; system("pause"); }
weixin_40101242 2018-10-12
  • 打赏
  • 举报
回复
#include <stdio.h>

int *p;
int a[8] = {1,2,3,5,2,3,5,6};
int *create()
{
// a[8] = {1,2,3,5,2,3,5,6};
// a[0]=1;

p=a;
return p;//返回得到的整型数组的指针
}


void main()
{
int i;
// int b[8] = {1,2,3,5,2,3,5,6};
// p=b;
p = create();

for(i = 0; i < 8; i++)
{
printf("%d\n",*p);
p++;
}
}
我是这样写的
anguoguo 2018-10-12
  • 打赏
  • 举报
回复
a是一个int数组,它的类型是int*,&a是取a的地址,它的类型应该是int**
另外a数组是在栈上创建的,其作用域在create()函数内部,函数返回后数组所占用的内存会被释放
可以使用malloc()函数在堆上动态分配内存
IamOrthoPole 2018-10-12
  • 打赏
  • 举报
回复
void create(int *p)
{
*p=num1;
*(p+1)=num2;

}
IamOrthoPole 2018-10-12
  • 打赏
  • 举报
回复
a本身就是个指针,指向a[0],不需要return &a;,直接return a;。但你这个数组a是栈变量,在函数结束后会被清理,会导致错误,所以需要在参数中传一个指针,在函数中改变这个指针指向的值,返回void
weixin_43395444 2018-10-12
  • 打赏
  • 举报
回复
数组 a 在 create 函数返回后内存已被回收
林多 2018-10-11
  • 打赏
  • 举报
回复
指针作为函数返回值,返回的是指向内容的地址。

栈上申请的内存(new方式,会在堆上申请内存,需要自己主动释放),在退出其作用域时,自动释放。

int array[3] = {1, 2, 3}; // 栈上内存,,退出作用域时,自动释放。

所以,函数返回的指针,所指向的内容(栈上),在退出函数(int *create())时,已经释放了。
所以,指向的内存地址,是一块未知的、非法的内存地址(不知道是啥内容)。

额外:
1. 指针和数组(首地址),是两个概念,最好不要把指针当成数组来用。
2. 补一下,堆与栈的知识吧。
  • 打赏
  • 举报
回复
引用 5 楼 weixin_40101242的回复:
[quote=引用 3 楼 adlay 的回复:]
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.


那这个应该怎么解决呢,网上好多都是这么写的[/quote] 数组定义为static
www_adintr_com 2018-10-11
  • 打赏
  • 举报
回复
引用 12 楼 Slzde_sub 的回复:
但是事实上编译器会对这个返回进行报错,因为返回类型和函数类型不同
你用的什么编译器会报错? 试试把你的文件扩展名改成 .c, 而不是 .cpp . 用 C 语言的编译器来编译, 不是用 C++ 的编译器来编译. 毕竟这里是 C 语言区, 讨论的是 C 语言.
引用 13 楼 Slzde_sub 的回复:
当然。 a 等价于 &a[0] 这个我是支持的 ,但是我不认为 &a 可以和 a 等价,
你可以打印 printf("%p", a) 和 printf("%p", &a) 来看他们的值是否是一样的就知道了. 一个数组只对应内存中一块连续的内存, 无论是 a, 还是 &a 都是这块内存的首地址, 没有多余的内存, 也就没有多余的内存地址的.
引用 14 楼 hjwang77 的回复:
不是吧,如果&a 等价于 &a[0], 那如果数组a 的元素是int *, 那 *a 和 *a[0]岂不是也一样?二维数组和一维数组不是混乱了?
在 C 语言里面, 二维数组本身就和一位数组没什么区别, 也只是一块连续的内存而已, 把二维数组转换成 int*p 后, 二维数组都可以按照一维数组的方式访问: p[y * width + x], 二维数组的 a[x][y] 访问方式不过是一个语法糖而已.
引用 15 楼 hjwang77 的回复:
不考虑栈的问题,函数定义的是返回int *, 而函数实现返回的是int **,没有强制转换编译起码是个警告
把返回类型认为是 int** 就错的有点离谱了. 注意数组 a 直接表示了一块内存, 而不是 a 定义了一个指针, 这个指针来指向一块内存, 注意这个区别: 建议看一下 C专家编程 这本书, http://blog.adintr.com/43
之味 2018-10-11
  • 打赏
  • 举报
回复
你返回的是数组a的地址,在主函数中得到的也是a函数的地址,但自定义函数creat结束后,会对数组a进行销毁,所以主函数得到了a的地址也没用,因为那个地址存放的数据已被销毁
sugufe 2018-10-11
  • 打赏
  • 举报
回复
那个变量a是临时变量,函数返回的时候就被回收了,返回地址也没有意义。
青涩知夏 2018-10-11
  • 打赏
  • 举报
回复
a 等价于 &a[0]
weixin_43205693 2018-10-11
  • 打赏
  • 举报
回复
a 等价于 &a[0] 这个我是支持的 ,但是我不认为 &a 可以和 a 等价
加载更多回复(17)
# 主成分分析PCA降维算法Python实现 - 数据降维和特征提取 ## 项目简介 本项目提供了主成分分析(Principal Component Analysis, PCA)算法的完整Python实现,包含从数据预处理到结果可视化的全套功能。PCA是一种经典的无监督降维算法,通过线性变换将高维数据投影到低维空间,同时保持数据的最大方差,广泛应用于数据降维、特征提取、数据可视化等领域。 ### 功能特点 - **完整的PCA算法实现**:包含数据标准化、协方差矩阵计算、特征值分解等核心步骤 - **多种数据生成器**:内置多种类型的测试数据生成功能 - **丰富的可视化功能**:支持解释方差图、散点图、双图、热力图等多种可视化方式 - **灵活的参数配置**:支持自定义主成分数量、标准化选项等 - **全面的分析工具**:包含特征重要性分析、重构误差计算、最优成分数量确定等 - **详细的示例代码**:提供多个应用场景的完整示例 ## 安装说明 安装依赖 ```bash pip install -r requirements.txt ``` ## 使用说明 ```bash # 运行所有演示 pytho ```bash # 运行所有演示 python main.py --demo all # 运行特定演示 python main.py --demo iris # 鸢尾花数据集分析 python main.py --demo high_dim # 高维数据降维 python main.py --demo correlated # 相关性数据分析 python main.py --demo comprehensive # 综合分析 # 指定输出目录 python main.py --output results ```
基于Javaweb的机房管理系统的设计与实现编程环境:idea2022平台,jdk1.8,tomcat8.5编程语言:java语言,编程技术:前端vue,div,css,后端:springboot框架,数据库:mysql5.7版本,Navicat Premium 12插件前台+后台前台学生注册,登录机房安全公告列表, 点击查看详情机房信息列表(点击搜索机房,查看到机房的详细情况)上机预约:选择机房,查看电脑信息,显示多少台电脑,点击可以查看机房的电脑详情,多少空闲的,点击可以预约电脑(填写预约时间,预约人)机房消防检公布设备故障上报:注册的学生也可以进行设备故障报修后台管理员管理员信息管理机房安全公告管理机房消防检查管理(记录每次的消防检查,对检查结果进行公布)教师信息管理维修人员管理注册学生管理,审核机房信息管理(多个机房)设备信息管理(电脑设备)填写CPU,内存,品牌,显卡等基本信息日志信息管理教师教师资料修改机房上机预约管理软件设备报修,查看维修结果硬件设备报修,查看维修结果上机信息管理:设置上机信息,下机信息,查看上机时间,查看到历史上机信息维修人员资料信息修改软件设备报修管理,填写维修结果硬件设备报修管理,填写维修结果设备故障报修管理:主要是针对学生前台提交的报修进行管理,处理学生学生资料修改我的预约信息我的上机:点击选择某个电脑进行上机,只能选择预约同意的电脑进行上机,我的下机:上机结束后,点击可以下机,并且计算出上机时间我的历史上机我的设备故障报修管理

70,026

社区成员

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

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