前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >函数返回指针

函数返回指针

作者头像
用户7272142
发布2023-10-11 20:58:19
发布2023-10-11 20:58:19
11100
代码可运行
举报
文章被收录于专栏:Republic博客Republic博客
运行总次数:0
代码可运行

先写一个例子,运行一下看看

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
int add(int a, int b)
{
    printf("a = %d  b = %d\n", &a, &b);
    int c = a + b;
    return c;
}
void print()
{

}
int main()
{
    int b = 5;
    int a = 6;
    printf("a = %d  b = %d\n", &a, &b);
    int res = add(a,b);
    print();
    printf("c=%d", res);
}

c = ? 大部分人会说11 也确实是11 因为是值拷贝 或者传递 返回的c也赋值给了res 这并没有什么难理解的,但如果我们要返回一个指针呢,再看一个例子。

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
int *add(int *a, int *b)
{
    printf("a = %d  b = %d\n", &a, &b);
     int c = (*a) + (*b);
    return &c;
}
void print()
{
    printf("hello world\n");
}
int main()
{
    int b = 5;
    int a = 6;
    printf("a = %d  b = %d\n", &a, &b);
    int *res = add(&a,&b);
    print();
    printf("c = %d", *res);
}

这时候的运行如果给res解引用的话是多少? 是一个不确定的值 可能是11也可能是一个垃圾值 在我的笔记本上运行的是11

看着运行没有错误是吧。但其实这是偶然性的结果,看图

我们在运行程序时,会先执行main函数 然后调用add函数 这时候main在堆栈就会暂停 将add压入堆栈 执行完add函数 add函数在堆栈中的数据 会被清空 也就是说我们返回的&c会被系统清空 而res是&c,所以解引用res就会出现错误.至于为什么我的结果依旧正确,可能是我写的函数没有占用到那块内存。 如果我把print函数写成

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
int *add(int *a, int *b)
{
    printf("a = %d  b = %d\n", &a, &b);
     int c = (*a) + (*b);
    return &c;
}
void print(int k,int y)
{
    int x = 1;
    printf("hello world\n");
}
int main()
{
    int b = 5;
    int a = 6;
    printf("a = %d  b = %d\n", &a, &b);
    int *res = add(&a,&b);
    print(b,a);
    printf("c = %d", *res);
}

得到的结果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档