c/c++程序内存区域分配
栈区(stack):在栈区上面创建的变量,出了作用域就销毁
动态内存函数:
malloc动态内存开辟函数
void malloc(size_t size);*
这个函数向内存申请一块连续可用的空间,返回起始位置的地址
开辟失败,返回一个NULL指针(返回值一定要检查)
使用malloc必须用free来释放,否则可能会导致内存泄露
free释放动态开辟的内存
void free(void ptr)*
ptr指向动态开辟的空间,不能是NULL指针
#include<stdio.h>
#include<stdlib.h>
int main(){
//动态开辟内存
int *p = malloc(175 * sizeof(int));
if (*p == NULL){
perror("malloc");
}
else{
for (int i = 0; i < 25; i++){
*(p + i) = i;
}
for (int i = 0; i < 25; i++){
printf("%d ", *(p + i));
}
}
//释放内存
free(p);
p = NULL;
return 0;
}
运行结果:
calloc动态内存开辟函数
void calloc(size_t num,size_t size)*
函数功能为num个大小为size的元素开辟一块空间,并将空间每个字节初始化为0
与malloc区别是calloc会在返回地址之前把申请的空间的每个字节初始化为全0
#include<stdio.h>
#include<stdlib.h>
int main(){
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL){
perror("calloc");
}
else{
for (int i = 0; i < 10; i++){
printf("%d ", *(p + i));
}
}
free(p);
p = NULL;
return 0;
}
运行结果:
realloc调整空间存在两种情况:
1:原有空间之后有足够大的空间,扩展内存就直接原有内存之后直接追加空间,原有空间的数据不发生变化;
2:原有空间之后没有足够大的空间,在堆空间上另找一个合适大小的连续空间来使用,函数返回一个新的内存地址;
int main(){
int *p = (int*)malloc(10 * sizeof(int));
if (p == NULL){
perror("malloc");
return 0;
}
for (int i = 0; i < 10; i++){
p[i] = i + 1;
}
int* ptr = (int*)realloc(p, 20 * sizeof(int));//扩容
if (ptr == NULL){
perror("realloc");
}
else{
p = ptr;
ptr = NULL;
}
for (int i = 0; i < 20; i++){
p[i] = i + 1;
}
for (int i = 0; i < 20; i++){
printf("%d ", p[i]);
}
free(p);
p = NULL;
return 0;
}
运行结果:
动态内存错误:
返回栈空间内容的问题