栈:方便,局限性
堆自由,额外释放,手动控制
int * p = (int *)malloc(4);
指在内存中分配了一个int指针,在堆内存中分配了4个字节的空间,把堆内存中分配的空间的首地址赋值给栈内存中的int指针。(也就是说:栈内存中的int指针指向的是堆内存中分配的内存空间的首地址)
所以int指针在栈内存上面,所以可以把指针写到大括号的外面,如下图:
堆内存上的空间需要手动释放:free(p)
自动变量
栈内存:先进后出,自动分配和释放内存(C++自动变量存储形式)
堆内存:需要手动分配和释放内存
malloc分配内存,malloc返回值是一个指针,指针指向分配出来的首地址,int*p=(int*)malloc(4)
free释放内存,free(p)
堆内存的头文件:
#include <stdlib>
而给堆内存赋字节需要用:
malloc(4);
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int a = 10;
int* p;
{
int b = 20;
//在栈内存中分配了一个int指针,然后在堆内存分配了4个字节的空间,然后把堆内存分配的空间的首字址分配给栈内存中的int指针。于是我们就得了一个4字节的堆内存,我们可以使用这个指针来操作这片内存
p = (int*) malloc(4);
}
*p = 4;
free(p); //释放
}
//自动变量,在作用域结束的时候就销毁了
//栈数据结构,先进后出
//在C++中,自动变量是通过栈管理的
//栈内存:随着作用域结束,变量被销毁/回收
//堆内存:不会随着作用域结束回收内存。分配内存必须要手动释放
分配内存用的是malloc函数
//malloc返回值是一个指针,指向分配出来的内存的首地址
//在内存中分配了一个int指针,然后在堆内存中分配4个字节的空间,把堆内存空间分配的首地址赋值给栈内存中的int指针
int * p = (int *)malloc(4);
//堆内存的头文件
#include <stdlib.h>
//使用p指针操作这个内存,这个内存不会在程序执行到大括号后就销毁,它会一直被保留,我们可以在大括号之外访问这片内存
//使用完堆内存变量后需要释放变量
//用free函数释放变量,传入参数为指向这块堆内存的指针
malloc的全称是memory allocation,中文叫动态内存分配
堆内存
<stdlib.h> : malloc和free在其中定义
malloc(4) : 分配4个字节的空间;
free : 释放变量
堆上管理指针变量 需要手动分配内存大小 介绍后手动释放销毁
栈 先进后出 用于作用域内的内存释放 自动管理
要用malloc 需要调用stdlib.h
①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
*p 指针
自动变量是通过栈管理的
堆变量函数。 堆内存:malloc(返回值是一个指针,指向分配出来的内存的首地址)malloc(4)指的是分配出4个字节的内存
stdlib.h
free释放内存。 free(指针名)
多听几遍
自动变量的自动反应在变量的销毁上,在作用域结束时,自动变量销毁掉——类似于在栈区内存
在堆区手动开辟内存分配空间用malloc,malloc返回值是一个指针,指向分配出来的首地址,堆区的内存在作用域结束后不会自动销毁,需要手动释放,用free。
#include<stdlib.h>
p=(int*)malloc(4)//堆内存首地址在栈内存上
变量只在一定的范围内有效,上面的例子中,b只在大括号(代码块)里有效。
代码在大括号外面会自动销毁里面的变量,所以b也叫自动变量。(栈内存)
为p指针分配一片4字节的堆内存,这样p在内存外也可以使用。
堆内存用完之后,要用free(p)来释放这片内存。
malloc & free
有固定作用域的变量,也称为自动变量,即内存空间的分配和销毁是自动的。大括号{ }结束就销毁释放,便无法再使用这个变量。
自动变量有的地方也叫栈内存,但还是有差别。c++中自动变量用栈的方式管理。栈是先进后出。
堆内存:与栈内存不同,堆内存上的空间不会随着作用域的结束而被释放回收。所以堆内存上的空间必须要手动释放。堆内存用到的函数在stdlib.h这个头文件中。其中malloc是如何分配一片内存,返回值是指针,是分配的内存空间的首地址。释放时使用:free(指针名)