malloc在C语言中的使用
preface: 一般而言,int temp[n];
这种写法是不可取的,但利用malloc可以做到。
一般有
1 2 3 4 5 6 7 8 9 10 11 12 13
| double *ptd; ptd = (double *) malloc(max* sizeof(double)); // 分配 max个double,相当于 double ptd[max]; if(ptd == NULL) // ptd 未能够正常 malloc { puts("memory allocation failed"); exit(EXIT_FAILURE); // 返回,一个值,表示程序异常 } ... free(ptd); //注意用完ptd记得释放内存。 ,free释放的是ptd指向的地址,所以只要指向的地址一样,就可以free其他的指针。
//还可以 int (*p)[6]; p = (int (*)[6]) malloc(n * 6 * sizeof(int)); //注意,我们这里默认不支持变长数组。
|
关于mallc的中的内存泄漏,可以参考下面的文章。
C/C++什么是内存泄露,内存泄露如何避免?_c++中内存泄漏是什么意思-CSDN博客
calloc
1 2 3 4 5 6 7 8
| (1)malloc函数。其原型void *malloc(unsigned int num_bytes); num_byte为要申请的空间大小,需要我们手动的去计算,如int *p = (int *)malloc(20*sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋值给指针p,此时申请的内存值是不确定的。
(2)calloc函数,其原型void *calloc(size_t n, size_t size); 其比malloc函数多一个参数,并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),这样就省去了人为空间计算的麻烦。但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0;
很多人会疑问:既然calloc不需要计算空间并且可以直接初始化内存,避免错误,那为什么不直接使用calloc函数,那要malloc要什么用呢? 实际上,任何事物都有两面性,有好的一面,必然存在不好的地方。这就是效率。calloc函数由于给每一个空间都要初始化值,那必然效率较malloc要低,并且现实世界,很多情况的空间申请是不需要初始值的,这也就是为什么许多初学者更多的接触malloc函数的原因。
|
原文链接:https://blog.csdn.net/weibo1230123/article/details/81503135