malloc


malloc只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我们习惯性的将其初始化为NULL


malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的

void *

void * p1;
int *p2;
p1 = p2;
// 就是说其他任意类型都可以直接赋值给它,无需进行强转,但是反过来不可以。

计算大小

int *p;
//返回类型为int *类型,分配的大小为sizeof(int)
p = new int;

//返回类型为int *类型,分配的大小为sizeof(int) * 100
p = new int[100];

而malloc则必须由我们计算字节数,并且在返回的时候强转成实际指定类型的指针。


int *p;
p = (int *)malloc(sizeof(int));

int demo

#include <stdio.h>
#include <iostream>
using namespace std;

int main() {

int array[5] = {10,15,20,30,35};

int * ap;
// 分配空间大小
ap = (int*)malloc(sizeof(int)*5) ;

cout << "ap.addr" << ap << ",val=" << *ap << endl;

int * apback;

// 备份地址
apback = ap;

for(int i=0;i<5;i++) {
*ap++ = array[i];
}

//恢复第0个地址
ap = apback;

for(int i=0;i<5;i++) {
cout << "second ap.addr" << ap << ",val=" << *ap << endl;
ap++;
}

return 0;
}

print


ap.addr0x10053def0,val=0
second ap.addr0x10053def0,val=10
second ap.addr0x10053def4,val=15
second ap.addr0x10053def8,val=20
second ap.addr0x10053defc,val=30
second ap.addr0x10053df00,val=35


char *

char *str;

/* 最初的内存分配 */
str = (char *) malloc(20);
strcpy(str, "welcome to c!");
printf("String = %s, Address = %u\n", str, str);


/* 重新分配内存 */
str = (char *) realloc(str, 25);

// 超过了分配大小
strcat(str, "welcome to c++!123456789012345678901234567890134567890");
printf("String = %s, Address = %u\n", str, str);

free(str);

超过分配长度


超过访问的长度能继续,但是破坏了其他地址的数据(当然后面的地址也不一定有人用,有人用肯定是破坏了)。


malloc分配的空间肯定是连续的,realloc会先探测后面的空间够不够,如果够就直接开辟,如果不够他会找一个新的地方开辟你要的空间,然后把内存内容拷贝到新开辟的空间。