动态内存分配
// main.m
// C10_动态内存分配
//
// Created by dllo on 15/7/13.
// Copyright (c) 2015年 cml. All rights reserved.
//
#import <Foundation/Foundation.h>
//
//void func (){
// int x =5;
// int y = 6;
// printf("x = %p\n",&x);
// printf("y = %p\n",&y);
//
//}
//
//
//char * fun(){
// // 是把一个常量字符串地址返回,但是如果返回一个数组的地址,在函数调用最后会回收栈的内容,返回不了结果,造成错误
//
// char *str = "iPhone";// 常量字符串,不可以放数组char stu[]="iPhone"
// return str;
//}
//
//// 定义一个全局变量
//int global =10;
//
//// 测试静态变量只会初始化一次
//void test(){
// static int test =10;
// test +=2;
// printf("%d\n",test);
//}
int main(int argc, const char * argv[]) {
// // 五大区所对应的地址
// // 1.栈区
// int a =10;
// int b =6;
// printf("展区的地址%p\n",&a);
//// printf("%p\n",&b);
//// func();
//
//// char *p =fun();
//// printf("%s\n",p);
//
//// printf("栈区的地址%p\n",&a );
// // 栈空间一般会放变量,c语言的数组等数据
// // 栈空间系统自己管理,开辟还是回收内存都有系统来做
// // 栈底对应的是内存的高地址,站顶对应低地址,栈里的变量先进后出
//
// // 2.堆区
// // 堆区只能使用匿名访问
// int * p =malloc(40);
// printf("堆空间地址%p\n",p );
// // 这块内存:手动开辟,手动回收
//
// // 3.全局静态区
// // 静态的变量
// static int c =10;
// printf("全局静态区地址:%p\n",&c);
//// printf("%p\n",&global);
// // 全局静态区特点
// // (1).如果没有初始值,默认为零
// // (2).周期从程序开始一直到程序结束才会消失
// // (3).他只会被初始化一次
//
//// test();
//// test();
//// test();
//
// // 4.常量区
//// int d =10;
//// if (100 == d) {
////
//// }
//// for ( int i =0 ;100 ==i; i++) {
//// printf("%d\n",i);
//// }
//
// // 常量在执行过程中不能发生变化,不能对常量进行赋值
// char *p2 ="iPhone";
// printf("常量区地址%p\n",p2);
//
// // 5.代码区
// printf("代码区的地址:%p\n",test);
//动态分配堆区的空间
// void *malloc(int size)
// 参数指的是所要申请的空间字节大小
// void *指的是无类型的指针,需要他是什么类型,只需要用相应的类型指针接收即可转换成相应类型
// 返回的是堆空间的内存首地址
// int *p =malloc(40);
// p[0] = 10;
// *(p+1) =10;
// printf("%d\n",p[0]);
// printf("%d\n",p[1]);
// printf("%p\n",&p[0]);
// printf("%p\n",p);
//
// int arr[5] = {0};
// arr[0] = 10;
// //堆空间使用第一件事先开辟内存
//
// // 对堆空间进行随机数赋值,范围是30 -70
//
// for (int i =0; i <10; i++) {
// p[i] = arc4random()%(41)+30;
// }
// for (int i =0; i<10; i++) {
// printf("%d\n",p[i]);
// }
// int *p =malloc(10 * sizeof(int ));
// 开辟10个字节空间
// 然后char*指针来接受
// 对这块内存进行赋值,赋值内容"iPhone"
// char *p =malloc(10);
// strcpy(p, "iPhone");
// printf("%s\n",p);
//
// // 如果对p进行指针的重指向,原本保存堆空间的地址被替换,这部分空间就找不到了,发生这种问题称为内存泄露
//
// // 回收
// free(p);
// // 过度释放
//// free(p);
// p[2] =97;
// printf("%c\n",p[2]);
// 野指针:堆一块已经释放掉的内存进行操作
// 1.先使用malloc .ps.申请相应字节数的空间
// 2.使用这部分内存
// 3.别忘了对他进行释放,不要过度释放
// 练习
// 有一个字符串,其中包含数字,提取其中的数字,要求动态分配内存保存
// char str[] ="dsaddfgjk243djfgop";
// int num =0;
//
//
// for (int i =0; str[i]!='\0'; i++) {
// if ((str[i]<='z'&&str[i]>='a')!=1) {
// num++;
// }
// }
// int numIndex =0;
// char *p= malloc(num+1);
// for (int i =0; str[i]!='\0'; i++) {
// if ((str[i]<='z'&&str[i]>='a')!=1) {
//
// p[numIndex]=str[i];
// numIndex++;
// }
// strcat(p, "\0");
// }
//
// printf("%s\n",p);
//
// // 为数字进行内存分配,有多少数字相应分配多少字节数
// //把数字放入到堆空间的字符里
// //把最后一位的'\0'进行赋值
// // 内存的释放
// free(p);
// calloc
// 用法和malloc差不多,只不过比malloc多一个刷碗的动作,会把每个字节的内容都清零
// void * calloc(int n, int size)
// int *p = calloc(10, sizeof(int ));
// for (int i =0; i<10; i++) {
// printf("%d ", p[i]);
// }
// printf("\n");
// int *p1 =malloc(10*sizeof(int ));
// for (int i =0; i <10; i++) {
// printf("%d ",p[i]);
// }
// printf("\n");
// int a =5,b = 10,c =15;
// //指针数组
// int *arr[3] ={&a, &b, &c};
// for(int i =0 ; i< 3;i++){
// printf("%d\n",*arr[i]);
// }
// char *str[3] = {"iPhone","Win8","Andiod"};
// for (int i =0; i<3; i++) {
// printf("%p\n",str[i]);
// }
//练习
// 输入3个单词,动态分配内存保存单词,并在最后输出
// 输入三个人的姓名,根据姓名长度,动态分配内存,然后进行储存,最后进行打印
// 定义一个指针数组
// char *words[3]={0};
// for (int i =0; i <3; i++) {
// char temp[50] ="";
// scanf("%s",temp);
// words[i] = calloc(strlen(temp)+1, sizeof(char));//words[i]==char *p
// strcpy(words[i], temp);
//
//
// }
// for (int i =0; i < 3; i++) {
// printf("%s\n",words[i]);
// }
// // 释放
// for(int i=0 ;i< 3;i++){
// free(words[i]);
// }
// realloc:重新进行内存的分配
// int *p = calloc(10, sizeof(int ));
// int *pNew =realloc(p , 80);
// printf("%p\n",p);
// printf("%p\n",pNew);
// 内存操作函数
// 内存初始化
// int *p = malloc(40);
// // 对内存进行初始化设置
// // 1.要初始化的空间
// // 2.初始化把值设置成0
// // 3.设置的范围
// memset(p, 0, 40);
// for (int i = 0; i<10; i++) {
// printf("%d\n",p[i]);
// }
// printf("\n");
// 内存的拷贝
// 第三个参数:拷贝的范围的字节数
// int *p =calloc(10, sizeof(int ));
// int *pNew =calloc(10, sizeof(int ));
// for (int i=0; i<10; i++) {
// p[i] =arc4random()%(70-30+1)+30;
// printf("%d ",p[i]);
// }
// printf("\n");
// memcpy(pNew, p, 40);
// for (int i =0; i<10; i++) {
// printf("%d ",pNew[i]);
// }
// printf("\n");
// 内存比较
// 第三个参数:比较的范围
// int *p1 = calloc(1, sizeof(int));
// int *p2 = calloc(1, sizeof(int));
// *p1 =255;
// *p2 =100;
//
//// memcmp(<#const void *#>, <#const void *#>, <#size_t#>)
// printf("%d\n",memcmp(p1, p2, 4));
// 定义两个整型指针,分别用malloc.calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1 -3,赋值后用memcmp比较两个数组.如果相同打印Good!否则打印Failed
// int *p1 =malloc(3*sizeof(int));
// int *p2 =calloc(3,sizeof(int));
// memset(p1, 0, 12);
// for (int i =0; i<3 ; i++) {
// p1[i]=arc4random()%1;
// p2[i]=arc4random()%1;
// printf("%d %d\n",p1[i],p2[i]);
// }
// if (memcmp(p1, p2, 12) == 0) {
// printf("Good\n");
// }else{
// printf("Failed\n");
// }
// free(p1);
// free(p2);
return 0;
}