本文主要是介绍C语言动态内存空间分配(malloc,calloc,realloc,free),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
为了代码观感美观,我将代码部分的注释删了
malloc
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>//使用动态内存分配函数的注意事项:
//1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针
//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问
//3.动态内存空间中的地址是在堆区,不能将非动态内存空间的地址赋值给堆区,
// 但可以将变量的值赋值给动态内存空间所指向的位置
//4.不能对非动态内存空间的地址进行free释放// 动态内存分配 malloc(wantMemorySize)
int main(){int* p = (int*)malloc(10 * sizeof(int));if (p == NULL){printf("%s\n", strerror(errno));}else{for (int i = 0; i < 10; i++){*(p + i) = i;int num = *(p + i);printf("%d\t", num);//0 1 2 3 4 5 6 7 8 9}}//当申请的动态内存空间不再使用时,应该还给系统printf("\n%d\n", p[4]);//4free(p);//free之后还要置为NULL,否则成为野指针,因为地址还在,只是地址里面的值没了p[5] = 1;printf("%d\n%d\n", p[4],p[5]);// -572662307 1p = NULL;return 0;
}
calloc
// calloc(count,sizeof(Type))默认将开辟的动态内存数组空间置为0, 因为初始化了,所以效率比malloc低。
int main(){int* p = (int*)calloc(10, sizeof(int));if (p == NULL){printf("%s\n", strerror(errno));}else{for (int i = 0; i < 10; i++){printf("%d\t", p[i]);}}// free函数用来释放动态内存空间的free(p);p = NULL;return 0;
}
realloc
//realloc(oldMemoryAddress , wantMemorySize)
//调整开辟的动态内存空间的大小
int main(){// 先使用malloc开辟20个字节的空间int* p = (int*)malloc(5 * sizeof(int));if (p == NULL){printf("%s\n", strerror(errno));}else{for (int i = 0; i < 5; i++){*(p + i) = i;printf("%d\t", *(p + i));//0 1 2 3 4}printf("\n");}//假设20个字节不能满足我们的使用了//现在希望有40个字节的动态内存空间可以使用//realloc调整开辟的动态内存空间的大小//1.realloc如果旧地址后面的空间能够满足新增的空间大小,就追加到旧地址的后面,返回旧地址//2.否则就开辟一块新的动态内存空间,将旧动态内存空间中的值拷到新动态内存空间中相应的位置,// 然后释放旧的动态内存空间,返回新动态内存空间的地址int* p_realloc = (int*)realloc( p , 40);if (p_realloc == NULL){printf("%s", strerror(errno));}else{ //不管是新地址还是旧地址依然给p管理,达到为p增加动态内存空间的目的p = p_realloc;for (int i = 5; i < 10; i++){*(p + i) = i;}for (int i = 0; i < 10; i++){printf("%d\t", *(p + i));//0 1 2 3 4 5 6 7 8 9 }}//因为p和realloc存放的地址是一样的,只需要把p放了就行free(p);p = NULL;p_realloc = NULL;return 0;
}//realloc也可以和malloc一样开辟动态内存空间
//realloc(NULL,memorySize)
int main(){int* p = realloc(NULL, 10 * sizeof(int));if (p == NULL){printf("%s", strerror(errno));}else{for (int i = 0; i < 10; i++){*(p + i) = i;printf("%d", *(p + i));//0123456789}}free(p);p = NULL;return 0;
}
这篇关于C语言动态内存空间分配(malloc,calloc,realloc,free)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!