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;
}
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会先探测后面的空间够不够,如果够就直接开辟,如果不够他会找一个新的地方开辟你要的空间,然后把内存内容拷贝到新开辟的空间。