标签:
结构体数组. 结构体指针->
//内存的五大分区: 栈区,堆区,静态去,常量区,代码区
//代码区:代码在编译后形成的二进制都放在代码区;
//常量区:放在常量区的常量是只读不可写的
// const int a = 5;//加了const关键字后就放在了常量区
// a = 6;//常量区的常量不能再次赋值
// const float b = 9;
// b = 8;
// char arr[] = "zhoujielun";
// arr[0] = ‘Z‘;//此处是复制了常量区的字符串,所以可以改变
// char *arr1 = "zhoujielun";
// arr1[0] = ‘Z‘;//用指针直接指向了常量区,并想通过指针修改字符串 常量区的常量不可以改变 导致系统程序崩溃
//静态区(全局区):
// static int a = 0;//这个变量经过static修饰放在了静态区
// 静态区的变量只能初始化一次
// 如果不给初始值 系统默认0
// 程序退出才被释放
// 放在花括号外面的变量 即 全局变量也是放在静态区的
//栈区:栈区里存放的是局部变量和函数参数
// 特点:先进后出 从高到低分配 从低到高是使用 栈低栈顶
// int a = 5;
// int b = 6;
// int c = 7;
// printf("%p\n",&a);
// printf("%p\n",&b);
// printf("%p\n",&c);
// int arr[3] = {1,2,3};
// for (int i = 0; i < 3; i++) {
// printf("%p\n",&arr[i]);
// }
// 通过指针 操作 返回栈内存是不安全的
// 栈区的内存是系统自动分配和释放的 栈区的空间容量是特别小的
//堆区:是由程序员手动的分配和释放的 他的空间比较大
// char *arr = malloc(8);//malloc 堆区
// arr = "iphone";//7位 指针常量区
// free(arr);
// strcpy(arr, "iphone");
// printf("%s\n",arr);
// int *a = malloc(4);
// *a = 4;
// printf("%d\n",*a);
// free(a);//释放 内存都是标记删除的
// a = NULL;
//其他内存分配函数
//calloc//自动清零
//void * = calloc(,);
// int *p1 = calloc(10, 2);//第一个参数表示有几个,第二个参数表示每个站几个字节
// for (int i = 0; i < 20; i++) {
// * (p1 + i) = 2;
// printf("%d",*(p1 + i));
// }
// printf("\n");
//realloc
//void * = realloc(,);//第一个参数表示想重新分配的内存,第二个参数表示想重新分配的字节数
// int *p2 = realloc(p1, 5);
// for (int i = 0; i < 5; i++) {
// *(p2 + i) = 2;
// printf("%d",*(p2 + i));
// }
//内存操作函数
//初始化内存
//memset 第一个参数是指针,第二个参数是设置内容(字符型的),第三个参数是几个字节
int *p1 = malloc(8);
int *p2 = memset(p1,107, 8);
for (int i = 0; i < 8; i++) {
printf("%c ",*(p2 + i));
}
//内存拷贝
//memcpy 第一个参数是目的指针,第二个参数是源指针,第三个参数是分配几个字节
char *p3 = malloc(5);
p3 = memcpy(p3, p2, 5);
for (int i = 0; i < 5; i++) {
printf("%c",*(p3 + i));
}
//内存比较
//memcmp 第一个参数是被减数,第二个参数是减数,第三个参数是比较几个字节 跟strcmp类似也是比较的ASCII码表的值
char *p4 = malloc(8);
char *p5 = malloc(8);
memset(p4, 65, 8);
memset(p5, 66, 8);
int count = memcmp(p4, p5, 8);
printf(" %d\n",count);
int *a = malloc(3*sizeof(int));
int *b = calloc(3,sizeof(int));
memset(a, 0, 12);
for (int i = 0; i < 3; i++) {
*(a + i) = arc4random() % 4;
*(b + i) = arc4random() % 4;
printf("a=%d b=%d\n",*(a + i),*(b + i));
}
int count1 = memcmp(a, b, 12);
if (count1 == 0) {
printf("Good!");
}
else
printf("Faided!");
//练习:找出字符串中的数字 使用内存分配
/* char arr[] = "a1b2c3d4";
// int length = sizeof(arr)/sizeof(char);
// for (int i = 0; i < length - 1 ; i++) {
// if (arr[i] >= 48 && arr[i] <= 57) {
// printf("%c ",arr[i]);
// }
// }
int count = 0;
char temp[100] = {0};
for (int i = 0; i < strlen(arr); i++) {
if (((*(arr + i)) >= ‘0‘) && (*(arr + i)) <= ‘9‘){
temp[count] = *(arr + i);
count++;
}
}
temp[count] = ‘\0‘;
char *arr1 = malloc(sizeof(char) * (count + 1));
strcpy(arr1, temp);
printf("%s\n",arr1);
free(arr1);
arr1 = NULL;//释放
//练习:输入3个姓名 保存输出 ,使用内存分配
char *name[3] = {0};
printf("请输入三个姓名:\n");
for (int i = 0; i < 3; i++) {
char temp[20] = {0};//空数组;
// scanf("%s",*(name + i));
scanf("%s",temp);
//char *p
*(name + i)= malloc(sizeof(char) * (strlen(temp) + 1));
strcpy(*(name + i), temp);
}
printf("......................??.??.??.??.??.??.??.??.??.??.??.??........................\n");
for (int i = 0; i < 3; i ++) {
printf("%s\n",*(name + i));
}//循环释放
for (int i = 0; i < 3; i++) {
free(*(name + i));
*(name + i) = NULL;
}*/
内存的五大分区
标签:
原文地址:http://www.cnblogs.com/sharkHZ/p/4984217.html