代碼架構(gòu)一(借助局部變量和void *)

利用局部變量或全局變量天生會(huì)自動(dòng)分配內(nèi)存空間的特性

錯(cuò)誤示范1:

struct testA {
  int a;
};
void main() {
  struct testA *ptr;
  ptr->a = 10;
}

以上代碼片段運(yùn)行會(huì)報(bào)錯(cuò):Segmentation fault 即段錯(cuò)誤,原因是還沒有給testA結(jié)構(gòu)體分配空間。

正確示范1:

struct testA {
  int a;
};
void main() {
  struct testA tst; // 這行是關(guān)鍵,局部變量會(huì)自動(dòng)分配內(nèi)存空間
  struct testA *ptr = &tst;
  ptr->a = 10;
}

以上代碼運(yùn)行正確!充分利用了局部變量的特性,當(dāng)然改成全局變量也是一樣的。

利用void *可以表示任何地址的特點(diǎn)來傳遞指針地址

注:任何類型的指針地址所占的空間都是固定的。

比如,在64位的電腦,指針地址占用的字節(jié)為8

char *a;
int *b;
printf("%d %d\n", sizeof (char *), sizeof(a)); //輸出 8 8
printf("%d %d\n", sizeof (int *), sizeof(b)); //輸出 8 8

下面修改一下testA結(jié)構(gòu)體,增加testC結(jié)構(gòu)體, 同時(shí)增加testB結(jié)構(gòu)體作為中間層用于傳遞地址。

struct testB {
  void * struct_testC_handle;
};
struct testC {
   int c;
};
struct testA {
  int a;
  struct testC *struct_testC_handle;
};
void main() {
  struct testA *p_a; 
  struct testB tstB;
  struct testC tstC;
  p_a->struct_testC_handle = &tstC; //開辟一個(gè)空間存放testC結(jié)構(gòu)體,這個(gè)空間的名字叫tstC,結(jié)構(gòu)體testA中的指針struct_testC_handle,指向tstC空間的首地址
  tstB.struct_testC_handle = p_a->struct_testC_handle;//這步是關(guān)鍵,為后面的強(qiáng)制類型轉(zhuǎn)換奠定了條件。testB結(jié)構(gòu)體里面的指針struct_testC_handle是void *類型,可以指向任意類型的結(jié)構(gòu)體(當(dāng)然確定指向哪種類型后,后面解析也要用這種類型);同時(shí)也方便傳遞參數(shù)(傳遞參數(shù)時(shí)只需要考慮變量,不需要考慮類型)
  p_a->struct_testC_handle->c = 666;//通過結(jié)構(gòu)體testA給testC結(jié)構(gòu)體變量賦值

  struct testC *p_c = (struct testC *)tstB.struct_testC_handle;//這里是強(qiáng)制類型轉(zhuǎn)換,可以通過testB結(jié)構(gòu)體這個(gè)中間變量實(shí)現(xiàn)了地址傳遞
  printf("%d\n", p_c->c); // 輸出 666
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容