プロジェクトでの構造体ポインタの割り当てと送信でいくつかの問題に遭遇しましたが、今日、まとめに戻りましたが、いくつかの知識ポイントが学習されていないようです。
以下の例を参照してください
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);
その結果、segfaultが発生しますが、これに遭遇したとき、構造ポインタが単なるポインタであり、4バイト変数であるため、構造が存在しないため、なぜ私は理解できませんでした(苦笑、本当に愚か、基礎がしっかりしていないようです)。メモリ空間。直接割り当てると、セグメンテーション違反が発生します
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関数を介してスペースを開き、構造体ポインターを介してこのメモリ空間を指す必要があります。これで十分です。今回はようやく理解しましたが、意識も深いです。その時までにまた勉強しなければなりません。
また、構造変数とポインタ変数についても理解しています。
ジョブに参加したばかりのときに考えてみてください。十分な経験がないため、学習したとしても、知識システム全体がクラウドに浮かんでおり、人全体のメンタリティと状態は勢いがあり、フローティングの状態なので、コードを見ても花を見ているだけで、何も感じません。そのため、多くの知識ポイントに問題があり、単純なコードロジックの多くが理解できなくなっています。緊張と焦りの結果、効率が非常に悪いので、最近、自分の考えや行動を振り返って見直していますが、本当に落ち着いて他人の影響を受けないようにすべきです。
以下は、プロジェクトで定義されている構造体と構造体ポインタについてです。当時、プロジェクトの構造体ポインタを直接代入できるのか疑問がありました。その後、上記のことを繰り返した後、再度コードを見直すと、プロトタイプが構造体変数であることがわかりました。定義の時点では、そのためのスペースが開かれているので、構造体のポインターをアドレスに直接ポイントするだけで十分です。そのときは、これが何のためにあるのかも理解する必要がありますが、これらの問題とナレッジポイントについては深く考えていません。
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);