以前总有一种疑惑。为什么结构体的指针有的需要用分配空间?有的不需要分配空间呢?现在总结一下思路:
一:关于结构体的定义问题:使用结构体一般会使用变量或者定义指针
typedef struct{int a;int b;}data;使用这个结构体的两种方式:
二:关于结构体指针的传递和调用的用法:
typedef struct{ int a; int b; }date; static int intcms(void *para){ int c = ((date *)para)->a; printf("c is %dn",c); } int main(int argc, char **argv) { date dates; dates.a = 9; dates.b = 2; intcms(&dates);}上述调用中采用的结构体变量。在传入函数时通过指针void *para指针传递过去。需要注意的是不能直接使用para->a来访问结构体的成员。为什么呢。这是因为para只是接收过来的地址。para虽然指向的结构体的首地址。但是这个指针并不知道自己指向的是什么内容和有多少成员。需要(date *)para强制转化一下。这样para就可以知道自己是什么类型的指针。有多少成员。
typedef struct{ int a; int b; }date; static int intcms(void *para){ int c = ((date *)para)->a; printf("c is %dn",c); } int main(int argc, char **argv) { date *dates = (date *)malloc(sizeof(date)); dates->a = 9; dates-> = 2; intcms(dates); free(dates);}上述代码使用结构体指针需要分配空间和释放空间。这是堆的使用。如果你不释放。在整个进程结束的时候。系统有会自动回收。简单的程序没什么问题。但是在需要分配大量的空间就可能导致出资源浪费或者内存耗尽的情况
三:结构体定义的几种方法
#include <stdio.h>#include <string.h>#include <malloc.h>/*先定义几类结构体*/struct str{ int a; int b;}str1;/*这是第一类结构体的形式,有结构体名,有结构体变量*/struct str2{ int a; int b;};/* 这是第二类结构体的形式,有结构体名,无结构体变量 */typedef struct { int a; int b;}STR3;/* 这是第三类结构体的形式,把结构体重定义为STR3 */typedef struct str4{ int a; int b;}STR4;/*这是第四类结构体的形式,把结构体重定义为STR4,还有结构体名称*/void main(){ /*定义各类的指针*/ struct str *p; struct str2 *p2; STR3 *p3; struct str4 *p4; STR4 *p5; /*-----------------------------------------------*/ p = &str1; /*结构体指针指向结构体变量的地址首地址*/ p->a=1; p->b=2; printf("p->a=%d,p->b=%dn",p->a,p->b); /*-----------------------------------------------*/ p2 = (struct str2 *)malloc(sizeof(struct str2)); /*为结构体指针分配对应结构体类型的大小的首地址*/ p2->a=1; p2->b=2; printf("p2->a=%d,p2->b=%dn",p2->a,p2->b); /*-----------------------------------------------*/ p3 = (STR3 *)malloc(sizeof(STR3)); /*为结构体指针分配对应结构体类型的大小的首地址*/ p3->a=1; p3->b=2; printf("p3->a=%d,p3->b=%dn",p3->a,p3->b); /*-----------------------------------------------*/ p4 = (struct str4 *)malloc(sizeof(struct str4));/*为结构体指针分配对应结构体类型的大小的首地址*/ p4->a=1; p4->b=2; printf("p4->a=%d,p4->b=%dn",p4->a,p4->b); struct str4 str4a; p4 = &str4a;/*结构体指针指向结构体变量的地址的首地址*/ p4->a=1; p4->b=2; printf("p4->a=%d,p4->b=%dn",p4->a,p4->b); /*--------------------------------------------------*/ /*-----------------------------------------------*/ p5 = (STR4 *)malloc(sizeof(STR4));/*为结构体指针分配对应结构体类型的大小的首地址*/ p5->a=1; p5->b=2; printf("p5->a=%d,p5->b=%dn",p5->a,p5->b); p5 = &str4a;/*结构体指针指向结构体变量的地址的首地址*/ p5->a=1; p5->b=2; printf("p5->a=%d,p5->b=%dn",p5->a,p5->b); /*--------------------------------------------------*/}运行结果如下: