【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


image.png






二、函数返回的栈内存指针


在 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)

image.png

目录
相关文章
|
1天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
10 3
|
1天前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
1天前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
1天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
20 2
|
3天前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
12 3
|
1天前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
1天前
|
存储 C语言
C语言指针(1)
C语言指针(1)
6 0
|
1天前
|
C语言
C语言函数
C语言函数
6 0
|
1天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
9 0
|
1天前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
7 0