动态分配数组 | 轻流扇
0%

动态分配数组

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的中的内存泄漏,可以参考下面的文章。

1
2
free(p->np);
free(p);

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


留下万分之一点,采得孤人所笑言