1、返回局部变量的地址
1 #include <stdio.h>
2
3 int *local_address(void)
4 {
5 int num;
6 printf("Sub function address: %p\n", &num);
7 return #
8 }
9
10 int main(void)
11 {
12 int *pn = NULL;
13 pn = local_address();
14 printf("Main function address: %p\n", pn);
15 *pn = 100;
16 printf("*pn = %d\n", *pn);
17 return 0;
18 }
结果:(基于Linux系统)
Sub function address: 0x7ffec3c04294
Main function address: (nil)
Segmentation fault (core dumped)
分析:
当子函数返回变量的地址“0x7ffec3c04294”赋给主函数的指针变量pn后,主函数的指针pn打印的不是局部变量的地址“0x7ffec3c04294”,而是(nil),这是因为子函数返回地址后num就自动释放掉了,所以主函数里面指针pn所打印的地址就出错了。如果指针pn还继续对局部变量地址对应的内存进行赋值,这时pn所指向的是野指针了,因为局部变量已经被释放掉导致地址被销毁了,所以pn就随机指向一个地址,这时对野指针赋值的话就会出错,所以主函数打印的是“Segmentation fault (core dumped)”,即段错误。
2、返回全局变量的地址
1 #include <stdio.h>
2
3 int num;
4
5 int *global_address(void)
6 {
7 printf("Sub function address: %p\n", &num);
8 return #
9 }
10
11 int main(void)
12 {
13 int *pn = NULL;
14 pn = global_address();
15 printf("Main function address: %p\n", pn);
16 *pn = 100;
17 printf("*pn = %d\n", *pn);
18 printf("num = %d\n", num);
19 return 0;
20 }
结果:(基于Linux系统)
Sub function address: 0x5559fa3fe014
Main function address: 0x5559fa3fe014
*pn = 100
num = 100
分析:
在函数外定义了一个全局变量num,子函数*global_address()和主函数main()打印的变脸地址都是“0x5559fa3fe014”,因为子函数运行完后定义在子函数的局部变量会释放销毁掉,但是定义在函数体外的全局变量只会在全部程序执行完之后才会自动释放并销毁,所以当主函数还没有结束运行的话全局变量依旧存在,这时指针pn是可以直接改变变量num的值的。