/*
C语言中提供了3个动态内存分配函数:
1)malloc 函数
格式: void * malloc(unsigned size);
从内存的堆区分配大小为size个字节的连续的内存空间
如果内存分配成功 返回内存的首地址
失败 NULL
*/
#include <stdio.h>
#include <stdlib.h>
/**
* malloc函数的使用
*/
void test1(){
//从内存中申请一块内存空间,可以存储4个整数
// = 赋值,要求等号的左右两侧的类型要一致
//p中存放的事新申请的内存空间的首地址
//注意:malloc 申请的内存空间,如果我们不赋值?
// 是垃圾数
int *p = (int *)malloc(4*sizeof(int)); //16个字节
//使用一个函数给malloc申请的空间进行初始化
memset(p,'a',16);
if (p!=NULL) {
//申请成功做的事情
// *p = 10;
// *(p+1) = 100;
// *(p+2) = 1000;
// *(p+3) = 10000; //存放4个整数
}else{
//内存申请失败
printf("内存申请失败!
");
}
for(int i=0;i<4 ;i++){
printf("%c ",*(p+i));
}
}
void test2(){
//callloc 分配指定块数和长度的内存空间
//格式:calloc(块数,长度)
//分配了4块,每一块内存长度为4的内存空间
//他们的地址也是连续的
//注意事项:
//calloc 它使可以帮我们自动的初始化为0
int *p = (int *)calloc(4, sizeof(int)); //16个字节
if (p!=NULL) {
//申请成功做的事情
*p = 10;
*(p+1) = 100;
*(p+2) = 1000;
*(p+3) = 10000; //存放4个整数
}else{
//内存申请失败
printf("内存申请失败!
");
}
for(int i=0;i<4 ;i++){
printf("%d ",*(p+i));
}
}
int main(int argc, const char * argv[]) {
int *p = (int *)malloc(4*sizeof(int)); //16个字节
printf("old %p
",p);
//realloc 函数可以给已经存在的空间扩充大小
p = realloc(p, 40*sizeof(int));
printf("new %p
",p);
//40个内存空间
if (p!=NULL) {
//申请成功做的事情
*p = 10;
*(p+1) = 100;
*(p+2) = 1000;
*(p+3) = 10000; //存放4个整数
*(p+39)= 1;
printf("%d
",*(p+39));
}else{
//内存申请失败
printf("内存申请失败!
");
}
for(int i=0;i<4 ;i++){
printf("%d ",*(p+i));
}
return 0;
}
//
// main.c
// 07-野指针和内存泄露
//
// Created by apple on 15/1/9.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
int *p1;
int *p = (int *)malloc(4*sizeof(int)); //16个字节
if (p!=NULL) {
//申请成功做的事情
*p = 10;
*(p+1) = 100;
*(p+2) = 1000;
*(p+3) = 10000; //存放4个整数
}else{
//内存申请失败
printf("内存申请失败!
");
}
//应该使用free()函数释放内存空间
//free(要释放的空间的首地址)
free(p);
//free(p)以后,p是一个野指针
p = NULL;
*p = 100;
printf("%d
",*p);
return 0;
}