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