1.结构体的基本使用(栈空间和堆空间分配内存)
#include <stdio.h>
typedef struct person
{
char name[64];
int age;
}myperson;
void printfper(myperson *per,int len)
{
int i;
for(i = 0;i < len;i++)
{
printf("%s,%d\n",per[i].name,per[i].age);
}
}
int main()
{
int i;
myperson per;
strcpy(per.name,"lily");
per.age=23;
printf("%s,%d\n",per.name,per.age);
myperson person[]={"zzz",16,"aaa",18};
int len = sizeof(person)/sizeof(myperson);
printfper(person,len);\
myperson *ps = malloc(sizeof(myperson)*3);
for(i = 0;i<3;i++)
{
sprintf(ps[i].name,"name_%d",i+1);
ps[i].age = 100+i;
}
printfper(ps,3);
return 0;
}
2.深拷贝和浅拷贝
1.浅拷贝是相当于一个人取了另外的名字,如一个人叫张三,现在改名字叫作李四,对张三或者李四进行操作,还是只对同一个人(相当于针对同一块内存)。
2.深拷贝就是以张三的所有基因为样本,克隆出一个叫李四的人,他们是两个完全独立的人,相互之间改变不会影响对方(相当于两块不同的内存。
#include<stdio.h>
#include<string.h>
typedef struct teacher
{
char *name;
int age;
}teacher;
int main()
{
teacher t1;
teacher t2;
t1.name = malloc(sizeof(char)*64);
memset(t1.name,0,64);
strcpy(t1.name,"aaa");
t1.age =23;
t2.name = malloc(sizeof(char)*128);
memset(t2.name,0,64);
strcpy(t2.name,"bbbbbbb");
t1.age =24;
if(t1.name != NULL)
{
free(t1.name);
t1.name = NULL;
}
t1.name = malloc(strlen(t2.name)+1);
strcpy(t1.name,t2.name);
t1.age = t2.age;
printf("%s,%d\n",t1.name,t1.age);
printf("%s,%d\n",t2.name,t2.age);
if(t1.name != NULL)
{
free(t1.name);
t1.name = NULL;
}
if(t2.name != NULL)
{
free(t2.name);
t2.name = NULL;
}
return 0;
}
3.结构体嵌套一级指针
#include<stdio.h>
#include<string.h>
typedef struct teacher
{
char *name;
int age;
}teacher;
teacher *allocateSpace()
{
int i;
teacher **tmp = malloc(sizeof(teacher)*3);
for(i = 0;i < 3;i++)
{
tmp[i] = malloc(sizeof(teacher));
tmp[i]->name = malloc(sizeof(char)*64);
memset(tmp[i]->name,0,64);
sprintf(tmp[i]->name,"name_%d",i+1);
tmp[i]->age = 23+i;
}
return tmp;
}
void printfTeach(teacher **t1)
{
int i;
for(i = 0;i < 3;i++)
{
if(t1[i]->name == NULL)
{
return ;
}
printf("%s,%d\n",t1[i]->name,t1[i]->age);
}
}
void freeTeach(teacher **t1)
{
int i;
for(i = 0;i < 3;i++)
{
if(t1[i]->name != NULL)
{
free(t1[i]->name);
t1[i]->name = NULL;
}
if(t1[i] != NULL)
{
free(t1[i]);
}
}
}
int main()
{
teacher **t1 = NULL;
t1 = allocateSpace();
printfTeach(t1);
freeTeach(t1);
return 0;
}
4.结构体嵌套二级指针
#include<stdio.h>
#include<string.h>
typedef struct teacher
{
char *name;
char **student;
}teacher;
int allocateSpace(teacher ***t1)
{
if(t1 == NULL)
{
return -1;
}
int i;
int j;
teacher **tmp = malloc(sizeof(teacher *)*3);
for(i = 0;i < 3;i++)
{
tmp[i] = malloc(sizeof(teacher));
tmp[i]->name = malloc(sizeof(char)*64);
memset(tmp[i]->name,0,64);
sprintf(tmp[i]->name,"name_%d",i+1);
tmp[i]->student = malloc(sizeof(char *)*4);
for(j = 0;j < 4;j++)
{
tmp[i]->student[j] = malloc(sizeof(char)*64);
memset(tmp[i]->student[j],0,128);
sprintf(tmp[i]->student[j],"%s_student_%d",tmp[i]->name,j+1);
}
}
*t1 = tmp;
return 0;
}
void printfTeach(teacher **t1)
{
if(t1 == NULL)
{
return ;
}
int i;
int j;
for(i = 0;i < 3;i++)
{
printf("%s\n",t1[i]->name);
for(j = 0;j < 4;j++)
{
printf("%s ",t1[i]->student[j]);
}
printf("\n");
}
}
void freeTeach(teacher **t1)
{
int i;
int j;
for(i = 0;i < 3;i++)
{
if(t1[i]->name != NULL)
{
free(t1[i]->name);
t1[i]->name = NULL;
}
for(j = 0;j < 4;j++)
{
if(t1[i]->student[j] != NULL)
{
free(t1[i]->student[j]);
t1[i]->student[j] = NULL;
}
}
if(t1[i]->student != NULL)
{
free(t1[i]->student);
t1[i]->student = NULL;
}
if(t1[i] != NULL)
{
free(t1[i]);
t1[i] = NULL;
}
}
}
int main()
{
teacher **s1 = NULL;
int ret;
ret = allocateSpace(&s1);
if(ret < 0)
{
return ;
}
printfTeach(s1);
freeTeach(s1);
s1 = NULL;
return 0;
}