函数返回指针

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

#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++

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

#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);
}
C++

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

函数返回指针

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

函数返回指针

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

#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);
}
C++

得到的结果

函数返回指针

C语言

内存泄露

2024-11-14 11:52:28

C语言

函数指针

2024-11-14 11:58:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索