【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
2023-06-13 09:17:59 时间
文章目录
一、函数返回的堆内存指针
在 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 语言内存泄露很严重,如何应对?
- Go 语言内存逃逸案例
- 内存映射文件原理_开源内存数据库
- Rust 视界周刊 Week 5 | 驳 “Rust 等内存安全语言的安全性并不优于C++”
- 原来C++变量在内存中不是紧密排列的,聊聊内存对齐
- 不背锅运维:Go语言切片内存优化技巧和实战案例
- 【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )
- 【C 语言】内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )
- 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )
- 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )
- 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
- Linux 下使用 C 语言实现文件内存映射:MMap(linuxcmmap)
- JVM内存组成
- Node.js中的内存泄漏分析
- PHP中的内存破坏漏洞利用(CVE-2014-8142和CVE-2015-0231)(连载之第三篇)
- 服务器MSSQL:谨防内存耗尽(服务器mssql吃内存)
- Linux下查看进程内存占用的技巧(linux查看进程占用内存)
- 揭秘Oracle内存存储的高效优势(oracle内存存储)
- Oracle极限内存值取决于你(oracle内存上限值)
- 如何限制单机Redis实例的内存使用(单机redis内存限制)
- 深入了解Oracle 4031内存错误(oracle 4031)
- MySQL内存表的特性与使用介绍