1. 如果有int A, int *B = &A, 这时执行free(B) 一定引起内存错误。
free只能使用在动态分配的内存上,不能用在堆栈或静态数据上。
类似 int A,或 static int A,这样的变量定义,是在编译时已经确定了内存位置。
动态分配是在运行时,从堆中临时分配的内存块(用malloc,或new)。这些内存块需要用 free(malloc)或delete(new)释放;
2. 变量名实际是内存地址的代称,这句也不完全对
在程序中,变量名代表了“这个地址上的数值”,只有对变量使用&操作,才能得到变量的地址
3. free(B)应该释放了B这个指针变量
如果指针变量存放了一个动态得到的地址,free(B)释放的是变量B的数值(不是变量B的地址),由于变量B的数值是一个动态分配得到的地址,所以free释放的是动态地址。
//用指针的指针当二维数组请参考以下代码#include <stdio.h>
#include <stdlib.h>
int main(){
int **b
b=(int **)malloc(sizeof(int *)*4) //二维数组b有4行
for(int i=0i<4i++) //替每行分配存储空间
b[i]=(int *)malloc(sizeof(int)*3) //二维数组b每行3列
for(int i=0i<4++i) for(int j=0j<3j++)
b[i][j]=i*j
for(int i=0i<4++i) {
for(int j=0j<3j++)
printf("%5d",b[i][j])
printf("\n")
}
for(int i=0i<4i++)
free(b[i]) //释放每行的存储空间
free(b)//释放b
return 0
}