C语言 malloc()函数
malloc()函数原型如下:
void *malloc(int size);
malloc()向系统申请分配指定size个字节的内存空间。返回类型是void*类型。void*表示未确定类型的指针。void1*类型可以强制转换为任何其他类型的指针。
从函数声明上可以看出。malloc()和new()至少有两个不同:
(1)new()返回指定类型的指针,且可以自动计算所需要大小。比如:
int *p;
var cpro_psid ="u2572954";
var cpro_pswidth =966;
var cpro_psheig =120;
p = new int; //返回类型为int*类型(整数型指针),分配大小为
sizeof(int); 或: int* parr;
parr = new int [100]; //返回类型为int*类型(整数型指针),分配大小为
sizeof(iirt) * 100;
(2)mallocO则必须计算宇节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) mallocr (sizeof(int));
malloc函数返回的是void*类型,如果写成如下格式:
p = malloc (sizeof(int));
程序无法通过编译,且报如下错误:“不能将void*赋值给int*类型变量”。所以必须通过(int *)来将强制转换。
函数的实参为sizeof(int),用于指明一个整型数据需要的大小。如果写成如下格式:
int* p = (int *) malloc (1);
代码也能通过编译,但只分配了1个字节的内存空间,当存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!这会导致后面的内存中原有数据内容全部被清空。mallocO也可以达到new[]的效果,申请出一段连续的内存,方法无非是指定所需内存大小。比如想分配100个int类型的空间:
int* p =(int *)malloc(sizeof(int)*100); //分配可以放得下100个聲敎的内.存空间
另外有一点无法直接看出的区别是,malloc()只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过mallocO或new()得到指针,在其他操作上保持一致。malloc()函数其实就是在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量。这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址。这取决于malloc()函数中参数size的具体内容。这里mallocO分配的内存空间在逻辑是连续的,而在物理上可以连续也可以不连续。对于程序员来说,关注的是逻辑上的连续,因为操作系统会帮助安排内存分配,所以使用起来就可以当作是连续的。
点击加载更多评论>>