- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #pragma warning(disable:4996)
- char *get_str4(void){
- char *d = (char *)malloc( 100 * sizeof(char) ); //d 栈区指针 给 d 创建堆区空间
- if (d == NULL) // 如果分配空间失败, 函数返回 0, 不在往下执行
- {
- return NULL;
- }
- strcpy(d, "abce");
- return d; // 返回 d 的地址
- }
- int main(void){
- char *dui = get_str4();
- if (dui != NULL)
- {
- printf("dui = %s\n", dui);
- free(dui);
- dui = NULL;
- }
- printf("\n");
- system("pause");
- return 0;
- }
内存分析
[注: 自己从老师讲解出理解的, 不对的地方望指正]
[注: 本程序验证是使用 vs2013 版]
前奏 1: 将代码放置代码区
前奏 2: 将全局变量找出来, abce 作为文字常量, 存放在全局区内
程序执行 1: 执行 main 函数: 在栈区创建 dui 指针变量 (main 中的所有变量都是在这个时候初始化, 分配地址, 分配空间)
程序执行 2: 在栈区给 get_str4() 分配空间
程序执行 3: 执行 get_str4() 函数: 在栈区创建 d 指针变量
程序执行 4: 在堆区指定一块区域, 并将该区域的地址存放到 d 中 (d 已经指向堆区的一块内存了)
程序执行 5: 将全区变量 abce 拷贝到 d 所指向的 堆区
程序执行 6: 释放 get_str4() 并且将 d 指向的地址返回;
程序执行 7: 将 d 指向的内容 放置在 dui 变量的内存里 (这时 dui 指向了 堆区内部创建的空间了)
程序执行 8: 打印出 dui 指向的内容
来源: http://www.bubuko.com/infodetail-3101008.html