理解内存分配
动态分配内存的函数常见的有 malloc、valloc、calloc、realloc、alloca 这几个,它们之间有什么区别呢?来看看这几个函数的原型:
1 2 3 4 5 6 |
void* malloc(size_t __size); void* calloc(size_t __count, size_t __size); void* valloc(size_t); void* realloc(void *__ptr, size_t __size); void* alloca(size_t); |
malloc 函数只有一个参数,即要分配的内存空间的大小。分配完内存后,里面的数据可能会是垃圾数据。
calloc 函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。分配完内存后,里面的数据都是空的。
编写一段测试代码:
1 2 3 4 5 6 |
char *p = malloc(100); printf("p=0x%x\n",p); char *p2 = calloc(10, 10); printf("p2=0x%x\n",p2); |
在调试器里查看,可以看到指针 p 地址的数据会是随机的垃圾数据,而指针 p2 地址的数据是清空的。
1 2 3 4 5 6 7 8 9 |
p=0x81584070 (lldb) x p 0x281584070: 00 00 00 00 00 00 00 00 fb 07 60 00 00 00 00 00 ..........`..... 0x281584080: 57 2f 76 61 72 2f 63 6f 6e 74 61 69 6e 65 72 73 W/var/containers p2=0x81589110 (lldb) x p2 0x281589110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x281589120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ |
valloc 函数只有一个参数,即要分配的内存空间的大小,但是与 malloc 的区别是 valloc 分配的内存空间大小会是对齐的,如果是 32 位系统就是 8 字节对齐,大小是 8 的倍数,如果是 64 位系统就是 16 字节对齐,大小是 16 的倍数。
realloc 函数是用于重新分配内存空间,实际代码如下:
1 2 3 4 5 6 |
char *p = malloc(100); printf("p=0x%x\n",p); char *p2 = realloc(p, 1000); printf("p2=0x%x\n",p2); |
使用前面的函数分配的内存,都是在堆中,在不使用时需要调用 free 进行释放,如果不释放会造成内存泄露,系统认为这块内存空间一直在使用中,下次再调用 malloc 分配内存时,就会在其他地址分配,但是内存是有限的,如果一直申请分配内存,但是没有释放,内存不够进程就会死掉。
而 alloca 函数是在栈里分配的内存,当 fun 执行完成后,栈里的数据会自动被回收。
1 2 3 4 5 6 |
void fun() { char *p=malloc(100); printf("p=0x%x\n",p); } |
转载请注明:exchen's blog » 理解内存分配