一、C语言内存分区详解
在C语言中,内存被划分为四个主要区域,用以存储不同类型的数据和执行不同的操作。
- 栈(Stack):用于存放函数的形参和函数内的局部变量。由编译器分配空间,并在函数执行完毕后由编译器自动释放。
- 堆(Heap):用于存放由动态分配函数(如malloc)分配的内存空间。程序员需要手动分配空间,并使用free进行释放。若忘记释放,会导致内存。
- 全局/静态区(Global/Static Area):存放全局变量和静态变量。这些变量在程序的整个运行期间都存在,由编译器负责分配和释放。
- 文字常量区(Literal Constant Area):存放常量字符串等文字常量,如char c = “123456”;也由编译器控制分配和释放。
- 程序代码区(Program Code Area):用于存放程序的二进制代码。
二、内存操作示例解析
例子一:
以下列出了几个变量和它们的存储位置:
- int a = 0; // 全局区
- int b; // 栈
- char s[] = "abc"; // s在栈,abc在文字常量区
- char p1, p2; // 栈
- char p3 = "123456"; // "123456"在常量区,p3在栈上
- static int c = 0; // 全局区
- p1 = (char )malloc(10); // p1在栈,分配的10字节在堆
例子二及问题分析(NO.1至NO.4):
这些例子涉及到动态内存分配、内存释放以及指针操作。每个例子后都有对问题的详细分析,解释了为何会出现问题,并提供了正确的做法。这里简要概述:
- NO.1:Test函数中申请的内存空间并没有实际分配,str指针始终为NULL。应确保申请了有效的内存空间后再进行拷贝操作。
- NO.2至NO.4:均涉及到内存分配、拷贝和释放的操作。重点在于正确使用malloc申请内存、正确使用strcpy进行拷贝、以及在释放内存后将指针设为NULL以避免野指针问题。
三、动态内存分配与释放注意事项
- 分配内存后需检查是否成功。
- 初始化内存单元。
- 使用内存时注意不要越界。
- 释放内存后将指针设为NULL。
- 避免野指针问题。