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