C语⾔中的malloc使⽤详解
⼀、原型:extern void *malloc(unsigned int num_bytes);
头⽂件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全⼀致的。)
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使⽤时,应使⽤free()函数将内存块释放。
举例:
#include<stdio.h>
#include<malloc.h>
int main()
{
char *p;
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x/n",p);
else
printf("Not Enough Memory!/n");
free(p);
return 0;
}
⼆、函数声明(函数原型):
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表⽰未确定类型的指针。
C,C++规定,void* 类型可以强制转换为任何其它类型的指针。这个在MSDN上可以到相关的解释,具体内容如下:
malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.
三、malloc与new的不同点
从函数声明上可以看出。malloc 和 new ⾄少有两个不同: new 返回指定类型的指针,并且可以⾃动计算所需要⼤⼩。⽐如:
int *p;
sizeof 指针 p = new int; //返回类型为int* 类型(整数型指针),分配⼤⼩为 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配⼤⼩为 sizeof(int) * 100;
⽽ malloc 则必须由我们计算要字节数,并且在返回后强⾏转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
第1、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序⽆法通过编译,报错:“不能将 void*赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。
第2、函数的实参为 sizeof(int) ,⽤于指明⼀个整型数据需要的⼤⼩。如果你写成:
int* p = (int *) malloc (1);
代码也能通过编译,但事实上只分配了1个字节⼤⼩的内存空间,当你往⾥头存⼊⼀个整数,就会有3个字节⽆家可归,⽽直接“住进邻居家”!造成的结果是后⾯的内存中原有数据内容全部被清空。
malloc 也可以达到 new [] 的效果,申请出⼀段连续的内存,⽅法⽆⾮是指定你所需要内存⼤⼩。
⽐如想分配100个int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
另外有⼀点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进⾏初始化,所以得到的⼀⽚新内存中,其值将是随机的。
除了分配及最后释放的⽅法不⼀样以外,通过malloc或new得到指针,在其它操作上保持⼀致。
四、动态申请数组
申请⼀维数组
⼀维数组的数组名可以看成数组起始元素的⾸地址,因此我定义⼀个int *arr的指针,分配n个⼤⼩的int型空间,写法如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n, *arr;
while (scanf("%d", &n) != EOF) {
arr = (int *)malloc(sizeof(int) * n);
}
return 0;
}
申请⼆维数组
⼆维数组的数组名是其所有⼀维数组的⾸地址,因为⼆维数组的数组名是指针的指针,因为我定义⼀个row⾏column列的⼆维数组,写法如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, row, column, **arr;
while (scanf("%d %d", &row, &column) != EOF) {
arr = (int **)malloc(sizeof(int *) * row); // 分配所有⾏的⾸地址
for (i = 0; i < row; i ++) { // 按⾏分配每⼀列
arr[i] = (int *)malloc(sizeof(int) * column);
}
free(arr);
}
return 0;
}
总结:
malloc()函数其实就在内存中⼀⽚指定⼤⼩的空间,然后将这个空间的⾸地址范围给⼀个指针变量,这⾥的指针变量可以是⼀个单独的指针,也可以是⼀个数组的⾸地址,这要看malloc()函数中参数size的具体内容。我们这⾥malloc分配的内存空间在逻辑上连续的,⽽在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使⽤起来就可以当做是连续的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论