C语言中程序员操作比较频繁的是栈空间和堆空间。
方法执行会入栈,执行结束出栈,在此过程中会涉及到变量(别名)在内存中的存储和销毁;示例代码如下:
//1 在栈中开辟空间,不用自己释放
int num = 9;
//2 使用malloc在堆空间中开辟内存,需要手动释放
int* arr = (int*)malloc(4);
printf("arr由malloc开辟内存空间,地址为%p\n",arr);
int* arr_new = realloc(arr, 8);
printf("arr_new由realloc在arr的基础上扩展的内存空间,地址为%p\n",arr_new);
if (arr_new) { // arr_new != null 非0即true
free(arr_new);
arr_new = NULL;//不执行此操作,会arr_new 会变成 悬指针
}
else {
free(arr);
arr = NULL;
}
执行结果:
arr由malloc开辟内存空间,地址为014CE030
arr_new由realloc在arr的基础上扩展的内存空间,地址为014CE030
其中realloc是在原先内存空间上的再扩展,它存在两种情况:①在原有的内存上追加,此时arr和arr_new指针存储的内存地址一样。②如果新开辟的空间过大,无法在原有的基础上扩展,会copy原有的空间到新开辟的空间中,并且释放原由的内存空间;这种情况下arr和arr_new的内存地址是不一样的。