结构体的动态内存分配与别名
回顾一下,以前讲的用malloc的动态内存分配,返回值是一个指针,指向的是这块内块的地址。 结构体其实也是一样的。例下
struct Student{
char* name;
int age;
};
void main(){
struct Student* p = (struct Student*)malloc(sizeof(struct Student) * 10);
p->age = 20;
p->name = "watson";
printf(p->name);
free(p);
system("pause");
}
关键 struct Student* p = (struct Student*)malloc(sizeof(struct Student) * 10); 可能看出,这样写,返回的,就是一个结构体的指针对象,右边还有一个强制转形,因为返回的是一个void* ,如果不转形,在C中可能没问题,在LIUNX中貌似就会出问题,所以还是采用标准写法
这里直接对p进行操作,根据以前的讲解,就是操作的第一个元素,p++后,就是操作第二个元素,所以可以利用指针的加减法来进行遍历过程
最后,用完动态内存都要记得释放掉
再讲讲别名
typedef struct Student{
char name[20];
int age;
}S,*S1;
void main(){
S s = {"waston",11};
S1 s1 = &s;
printf(s1->name);
system("pause");
}
用typedef来定义一个别名,这里定义了结构体的别名S,还定义了一个结构定的指针别名S1,在main中可以看出,真的跟JAVA的写法越来越像了。
最后讲结构体中的函数指针
typedef struct Student{
char *name;
int age;
void(*sayHi)(char*);
}Student;
typedef Student *StudentP;
void say(char *text){
printf("SAYHI");
}
void main(){
Student s = {"watson",11,say};
StudentP p = &s;
p->sayHi("saysomething");
system("pause");
}
首先是定义了一个和结构体名一样的别名,为什么这样定义呢,因为方便,申明的时候可能不写struct几个词,其次是定义了一个结构体指针
结构定中,定义了一个函数指针! 和以前讲的一样,只需要定义函数指针的返回值,以及参数类型就行了。
在外部传入一个同样结构的方法就行! 直接把方法名传入就行,因为方法名就是它的内存地址,就是指针,和&say是一样的效果。
其它逻辑和一起说的一样。