我想讓這個程式合法且正確:
#include <assert.h>
#include <stdlib.h>
#define SOME_INT 5
void assign_to_x(??) {
???
}
void main(void){
int *x;
assign_to_x(?);
assert(*x == SOME_INT);
// potential cleanup
}
最初x指向某個位置,這樣我就無法取消參考它而不會導致未定義的行為。所以在assign_to_x我不能只放入SOME_INT它指向的位置。那我有什么選擇呢?
我看到的一個選擇是:
void assign_to_x(int **x) {
*x = (int *)malloc(sizeof(int *));
**x = SOME_INT;
}
void main(void){
int *x;
assign_to_x(&x);
assert(*x == SOME_INT);
free(x);
}
然而,這似乎是一種矯枉過正。
我能想到的另一件事是:
void assign_to_x(int **x) {
static int y = SOME_INT;
*x = &y;
}
void main(void){
int *x;
assign_to_x(&x);
assert(*x == SOME_INT);
}
但它真的有效嗎?有不同的規范選項嗎?
uj5u.com熱心網友回復:
如果static int解決方案滿足您程式的需求,那么解決方案就可以了。重要的是要知道,如果程式后來被修改,因此它需要多個實體*x,比如說因為它被重新設計為使用多個執行緒來完成某些作業,那么static int除非它也被修改,否則解決方案將會中斷。
該malloc解決方案有一個錯誤;sizeof(int *)應該具有 a 的大小int,而不是指向 a 的指標的大小int。
否則,malloc解決方案不會過度設計,只是在 C 中不需要強制轉換;*x = (int *)malloc(sizeof(int));可以*x = malloc(sizeof **x);。這是允許的,因為 C 允許將回傳的void *型別隱式轉換為. 這是首選,因為如果程式員意外地未能宣告(如通過包含),它將允許編譯器產生警告。(使用強制轉換,由于 C 開發的歷史,一些編譯器會生成一個帶有回傳型別的默認宣告,然后顯式強制轉換會將其轉換為。如果沒有強制轉換,編譯器會發出錯誤分配的警告的到。)mallocint *malloc<stdlib.h>mallocintintint *intint *
它也更好用,sizeof **x而不是sizeof(int *)因為 then, ifx稍后更改為其他型別,例如double **x,sizeof也不需要更改;它會自動遵循x.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462117.html
