先写一个例子,运行一下看看
#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++得到的结果