关于结构体指针

关于结构体指针赋值和传值得问题在项目中遇到了几次,今天又遇到了就来总结一下,看来还是某些知识点没有学到位啊。
看下面的例子

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 typedef struct data
  5 {
  6     int a;
  7     int value;
  8     char type;
  9     int width;
 10     int height;
 11 }DATA,*PDATA;
 12 
 13 
 14 void structprintf(struct data *pData)
 15 {
 16     printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pData->a,pData->value
 17         ,pData->type,pData->width,pData->height);
 18 }
 19 
 20 int main(void)
 21 {
 22     PDATA pDa ;
 23     
 24     printf("%d\n",sizeof(pDa));
 25 
 26     pDa = (PDATA)malloc(sizeof(struct data));
 27 
 28     printf("%d\n",sizeof(pDa));
 29 
 30     pDa->a = 2;
 31     pDa->value = 3;
 32     pDa->type = 'a';
 33     pDa->width = 1230;
 34     pDa->height = 2340;
 35     
 36     structprintf(pDa);
 37 
 38     printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pDa->a,pDa->value
 39                 ,pDa->type,pDa->width,pDa->height);
 40                 
 41     free(pDa);
 42     
 43 //  printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pDa->a,pDa->value
 44 //                 ,pDa->type,pDa->width,pDa->height);
 45                    
 46     pDa = NULL;    
 47     
 48     return 0;
 49 } 

在上面的例子中如果直接定义一个结构体指针:

 PDATA pDa ;

然后不用malloc函数开辟空间就执行下面的赋值操作

 30     pDa->a = 2;
 31     pDa->value = 3;
 32     pDa->type = 'a';
 33     pDa->width = 1230;
 34     pDa->height = 2340;

然后通过printf直接打印上面的成员结果

 38     printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pDa->a,pDa->value
 39                 ,pDa->type,pDa->width,pDa->height);

结果会出现段错误,当时遇到这个竟然没有明白为什么(苦笑,真是笨啊,看来还是基础不扎实),是因为结构体指针只是一个指针,一个四字节的变量,因为没有结构体的内存空间,直接给其赋值的话,就会出现段错误

28		printf("%d\n",sizeof(pDa));
(gdb) n
4
30		pDa->a = 2;
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x080484b8 in main () at struct.c:30
30		pDa->a = 2;

当时在项目开发中,就遇到定义了一个结构体指针变量,然后传递给了另一个函数,然后在使用该结构体指针传递结果的函数中,打印结构体成员值,发现打印的值为0,当时还纳闷为什么没有值呢,左检查又检查,没有错误啊,但是就是不能达到预期结果,后来就把结构体指针变量更换为了结构体变量,然后通过地址的方式传递,就可以了,当时只是记录下来了,这个问题,但是后来在此想复现和调查时,怎么也想不起来怎么操作了,现在又遇到了,终于把这个搞明白了,这次也想到在数据结构中,在链表中添加新的节点时,定义一个结构体指针,然后就需要通过malloc函数开辟有一个空间,然后通过结构体指针指向这个内存空间,就可以了,这次终于明白了,也深深的意识到自己应该重新再次学习了。
也对结构体变量和指针变量有了一个认识
想想刚刚入职的时候,因为经验不足,虽然学习过,但是整个知识体系是在云中飘的状态,并且整个人的心态和状态都是浮躁和飘的状态,所以看code都是走马观花,感觉也没啥嘛,所以有很多知识点就这样错过去了,导致自己很多简单的code逻辑都是看不明白,越是看不明白越是紧张急躁,导致的结果就是效率很差,所以啊,最近在反思和复盘自己的思想和行为,真的应该静下心来了,不要在受其他的影响。
下面是关于项目中定义的结构体和结构体指针,当时就有疑问,为什么项目的结构体指针可以直接赋值呢,后来经过上面的事情后,重新review code,发现原来,原型是结构体变量,在定义的时候已经为其开辟了空间,所以直接让结构体指针指向地址就可以了,当时应该也明白这样做是为了什么,只是没有深入的考虑这些问题和知识点

typedef struct _s_copy_service
{
	S_CPYJOB_INFO   stCopyJobInfo;  //this info shared with printing
	S_CPYSCAN_INFO  stScanInfo;
} S_COPY_SERVICE, *PS_COPY_SERVICE;

const PS_CPYJOB_INFO    pCpyInfo      = &(pSrv->stCopyJobInfo);
const PS_CPYSCAN_INFO   pScanInfo     = &(pSrv->stScanInfo);
发布了53 篇原创文章 · 获赞 16 · 访问量 2213

猜你喜欢

转载自blog.csdn.net/m0_37757533/article/details/100516940