多级指针和静动态内存的跨函数访问
生活随笔
收集整理的這篇文章主要介紹了
多级指针和静动态内存的跨函数访问
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考:多級指針(靜動態內存的跨函數訪問)
作者:枕上
發布時間: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總結
以上是生活随笔為你收集整理的多级指针和静动态内存的跨函数访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用发布托管平台
- 下一篇: 椭圆曲线方程加解密算法研究(一)