美文网首页
结构体的动态内存分配与别名

结构体的动态内存分配与别名

作者: 贝克街的猫大哥呀 | 来源:发表于2017-08-21 00:58 被阅读0次

    回顾一下,以前讲的用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是一样的效果。

    其它逻辑和一起说的一样。

    相关文章

      网友评论

          本文标题:结构体的动态内存分配与别名

          本文链接:https://www.haomeiwen.com/subject/prbqdxtx.html