堆和栈是两种不同的内存管理方式。在程序内存布局场景下,堆与栈表示两种内存管理方式;在数据结构场景下,堆与栈表示两种常用的数据结构。
堆是由操作系统自动分配释放的,用于存放函数的参数值、局部变量等。而栈由操作系统自动分配释放,用于存放函数的返回地址、参数值、局部变量等。
在申请大块内存时,堆比栈更为灵活,但是使用起来不如栈方便。在 Windows 下,最好的方式是用 Virtual Alloc 分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存。
当函数调用结束后,局部变量会先从栈中出栈,然后是参数,最后栈顶指针会被重置为函数开始时存储的地址,也就是主函数中的下一条指令,程序会从该点继续运行。堆内存通常在堆的头部存放一个字节来表示其大小。堆内存的具体内容由程序员自己分配和管理。
下面是关于字符数组和指针在内存中的存取效率比较:
```c
char s1[] = "aaaaaaaaaaaaaa"; // 在编译时期就已经确定了字符串的长度
char *s2 = "bbbbbbbbbbbbbbbbb"; // 在运行时刻才赋值,但长度也是固定的
// 存取效率比较
// 数组:在编译时期就已经确定了字符串的长度,存取效率较高;
// 指针:在运行时刻才赋值,但可以使用指针进行动态内存分配,存取效率相对较低。
```
需要注意的是,上述代码中的字符串字面量是通过常量存储在只读数据段中的,因此无法修改。如果需要使用动态内存分配来创建可修改的字符串,可以使用指针或相关函数(如strcpy、strcat等)来进行操作。