#include<stdio.h>
#include<stdlib.h>
#include<malloc.h> //alloca函数的头文件
int main()
{
int *p = NULL;
int *p2 = NULL;
int *p3 = NULL;
int *p4 = NULL;
int *p5 = NULL;
int i = 0;
p = (int *)malloc(sizeof(int) * 3); //不会初始化内存。
printf("%p\n",p);
for(i = 0 ;i< 3;i++)
{
printf("%d\n",p[i]);
}
p2 =(int *)calloc( 3,sizeof(int) ); //第一个元素是元素的个数,第二个元素是元素的大小。 内存初始化为0
printf("%p\n",p2);
for(i = 0 ;i< 3;i++)
{
printf("%d\n",p2[i]);
}
p3 = (int*)realloc(p,sizeof(int) *10); //内存的拓展,如果内存允许,会在原有内存的后面直接拓展,如果内存不允许,会重新开辟一块内存。将原来的内存中的东西拷贝过来,但是开辟后面的字节数不会设为'\0',
printf("%p\n",p);
printf("%p\n",p3); //这两个地址不同,所以我们要注意当用这新开辟的内存的地址时要用新的首地址,而不是旧地址。
printf("p3各元素:");
for(i = 0 ;i< 10;i++)
{
printf("%d\n",p3[i]);
}
p4 = (int*)_recalloc(p2,10,sizeof(int)); // 这个函数和realloc函数差不多,只是它将新开辟的内存字节设置为0. 这四个函数都是在堆上分配内存,
printf("%p\n",p2);
printf("%p\n",p4);
printf("p4各元素:");
for(i = 0 ;i< 10;i++)
{
printf("%d\n",p4[i]);
}
/*if(p !=NULL)
{
free(p);
p = NULL;
}
if(p2 !=NULL)
{
free(p2);
p2 = NULL; //为啥释放p p2 会出错呢? 因为内存拓展函数,如果是在原来的内存后面拓展内存,释放拓展函数的内存首地址,原来的内存自然就会释放,如果是在新的内存块中拓展内存,将原来的那块内存数据拷贝到新的内存后,那块内存会释放,但是坑爹的是没有将那块内存首地址置为空指针,所以这里释放原来的地址出错。因为已经释放了,花了20分钟才知道错在什么地方。
}*/
if(p3 !=NULL)
{
free(p3);
p3 = NULL;
}
if(p4 !=NULL)
{
free(p4);
p4= NULL;
}
/*char str[10] = "abdjei";
char insertstr[20] = "jd";
char insertstr2[20] = "jdieji";
if()*/
p = (int *)alloca((sizeof(int )*10));//在栈上开辟新的内存。包含头文件malloc.h
printf("________________________________\n");
for( i = 0 ;i < 10;i++)
{
//p[i] = i;
printf("%d\n",p[i]);
}
system("pause");
return 0;
}