多级指针(静动态内存的跨函数访问)
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多级指针(静动态内存的跨函数访问)相关的知识,希望对你有一定的参考价值。
参考:多级指针(静动态内存的跨函数访问)
作者:枕上
发布时间:2021-07-15 00:27:17
网址:https://blog.csdn.net/jinchi_boke/article/details/118724993?spm=1001.2014.3001.5501
多指针初认识:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 100;
int *p = &i;
int **q = &p;
int ***r = &q;
//r = &p; //error 因为r是 int*** 类型,r只能存放 int** 类型变量的地址
printf("i = %d\\n",***r);
system("pause");
return 0;
}
输出结果:
i = 100
动态内存和多级指针的跨函数访问
#include <stdio.h>
#include <stdlib.h>
void f(int **p)
{
*p = 10;
}
int main()
{
int *p = (int *)malloc(4);
f(&p);
printf("*p = %d\\n",p);
system("pause");
return 0;
}
输出结果:
*p = 10
动态内存和静态内存的比较:
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存由程序员手动分配,手动释放
动态内存是在堆分配的
静态内存不可以跨函数访问:
通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。
#include <stdio.h>
#include <stdlib.h>
void f(int **q)
{
int i = 10;
//*q等价于p q和**q都不等价于p
//*q =i;//error 因为*q = i等价于p = i;这样写是错误的
*q = &i; //等价于 p = &i;
}
int main()
{
int *p;
f(&p);
printf("%d\\n",*p); //本语句语法没有问题,但是逻辑上有问题
system("pause");
return 0;
}
输出结果:
10
这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。
因为当 f( ) 函数执行完毕之后,函数终结(也就是函数的出栈),此时函数静态分配的变量的空间会被全部释放,静态变量的空间访问权限会还给操作系统,我们不能再对他进行读写操作。具体到这个 f( ) 函数就是 ,变量 q 没了,变量 i 没了, i 的值 10 也没有了。也可以说 p 指向 的 变量 i 的空间没了。
那么main 函数 就不能访问 i 的值,也就是 printf("%d\\n",*p) 中的 *p 逻辑上是不可以的。
但是 指针P 可以存放着 i 的地址。但是不能访问 i 的空间,没有权限进行读写操作。
动态内存跨函数访问:
malloc堆分配的动态内存,不会随着函数的结束而被释放,只有手动free才会被释放
#include <stdio.h>
#include <stdlib.h>
void f(int **q)
{
*q = (int *)malloc(sizeof(int)); //等价于 p=(int *)malloc(sizeof(int))
//q = 10; //error
//*q = 10; //等价于 p = 10;
**q = 10; //等价于 *p = 10;
}
int main()
{
int *p = (int *)malloc(4);
f(&p);
printf("*p = %d\\n",*p);
system("pause");
return 0;
}
输出结果:
*p = 10
以上是关于多级指针(静动态内存的跨函数访问)的主要内容,如果未能解决你的问题,请参考以下文章