形参修改不会影响实参场景。
#include <stdio.h>
#include <stdlib.h>
void func03(int* temp)
{
temp = (int*)malloc(sizeof(int));
*temp = 1000;
}
int main(int argc, char* argv[])
{
int* p3 = NULL;
func03(p3); // 值传递,形参修改不会以影响实参。
printf("*p3 = %d\n", *p3); // err:操作空指针指向的内存。
getchar();
return 0;
}
在函数中分配的内存,函数结束即释放。形参在函数执行时分配空间。实参p3进入到函数中,实际上,是把实参的值复制给了形参,形参在函数中,又重新用malloc赋值了一次。所以导致形参的值发生了变化,指向了新的地址。实参的值未受到影响。所以实参p3还是个空指针。
地址传递修改内容场景
void func04(int* tmp)
{
*tmp = 100;
}
int main()
{
int* p4 = NULL;
p4 = (int*)malloc(sizeof(int));
func04(p4);
printf("*p4 = %d\n", *p4); // *p4 = 100;
getchar();
return 0;
}
实参p4指向的地址存在,这个地址传递给函数的形参,在函数给这个地址写入了值。
这个地址归主函数main来管理,子函数结束也无法释放这块空间。所以传值成功。
注意对p4空间释放。
静态局部变量不释放场景
int* func02()
{
static int b = 10; // 静态区局部变量
return &b;
}
int main(int argc, char* argv[])
{
int* p2 = NULL;
p2 = func02();
*p2 = 1000;
printf("*p2 = %d\n", *p2);
getchar();
return 0;
}
静态区局部变量b,程序运行结束之后统一收回。
堆区空间不释放还可以用场景
int* func05()
{
int* temp = NULL;
temp = (int*)malloc(sizeof(int));
*temp = 100;
return temp; // 返回堆区地址,函数调用完毕,不释放。
}
int main()
{
int* p5 = NULL;
p5 = func05();
printf("*p5 = %d\n", *p5);
// 堆区空间,使用完毕,手动释放。
if (p5 != NULL)
{
free(p5);
p5 = NULL; // 别忘了把p5赋值为NULL。
}
getchar();
return 0;
}
堆区空间需要等待程序员手动释放。