文章目录
一、函数返回的堆内存指针
二、函数返回的栈内存指针
一、函数返回的堆内存指针
在 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)