構造ポインタについて

プロジェクトでの構造体ポインタの割り当てと送信でいくつかの問題に遭遇しましたが、今日、まとめに戻りましたが、いくつかの知識ポイントが学習されていないようです。
以下の例を参照してください

  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);
53件の元の記事を公開 賞賛された16件 訪問2213件

おすすめ

転載: blog.csdn.net/m0_37757533/article/details/100516940