【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、函數返回的堆內存指針
- 二、函數返回的棧內存指針
一、函數返回的堆內存指針
在 main 主函數中 , 調用 get_memory 子函數 , 返回 malloc 初始化的堆內存 , 可以 正常 使用指針 操作該 堆內存 ;
代碼示例 :
#include <stdio.h> #include <stdlib.h>/* 該方法獲取一塊內存地址 */ char *get_memory(int memory_size) {// 聲明指針, 用于接收分配內存地址// 該變量是在棧內存中char *p = NULL;// 堆內存分配一塊內存// 這塊內存不會因為 get_memory 函數執行完畢導致釋放p = (char *)malloc(sizeof(char) * memory_size);// 如果內存分配失敗, 返回空if(p == NULL){return NULL;}// 返回分配的內存return p; }int main() {char *p = NULL;// 獲取內存地址 , 獲取的是堆內存的地址// 該堆內存是在 get_memory 函數中進行分配的p = get_memory(10);if(p == NULL){return 0;}// 向 p 指向的內存空間中拷貝數據strcpy(p, "123456");// 向printf("%s\n", p);return 0; }執行結果 :
123456二、函數返回的棧內存指針
在 main 主函數中 , 調用 get_memory 子函數 , 返回棧內存中初始化的數組首地址 , 可以 使用指針 操作該 返回的數組首地址地址 , 讀取 數據異常 ;
get_memory 函數中 , 聲明的棧內存數組 , 只能在 get_memory 函數中使用 , 超出該函數的范圍 , 則該數組空間被回收了 ; 在外部函數中強行使用該地址 , 會造成位置結果 , 最壞宕機 , 最好情況訪問出異常結果 ;
代碼示例 :
#include <stdio.h> #include <stdlib.h>/* 該方法獲取一塊內存地址 */ char *get_memory(int memory_size) {// 棧內存中初始化一個數組char buffer[memory_size];// 向數組中拷貝數據strcpy(buffer, "123456");// 打印棧內存數組中的數據printf("get_memory : %s\n", buffer);// 返回數組首地址return buffer; }int main() {char *p = NULL;// 獲取 get_memory 函數中的棧內存地址p = get_memory(10);// 打印函數中獲取的 棧內存 數組 首地址內容printf("main : %s\n", p);return 0; }執行結果 :
get_memory : 123456 main : (null)總結
以上是生活随笔為你收集整理的【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】内存四区原理 ( 常量区示例
- 下一篇: 【C 语言】内存四区原理 ( 栈内存属性