2010-09-13 80 views
5

最近我查閱了一些C代碼,並發現了一些等同於以下內容:結構在C數組成員

struct foo { 
    int some_innocent_variables; 
    double some_big_array[VERY_LARGE_NUMBER]; 
} 

作爲差不多,但不完全,幾乎完全用C一個新手,我是正確的思維是由於數組成員,這個結構在使用空間方面效率非常低?當這個結構作爲參數傳遞給函數時會發生什麼?是否將其全部複製到堆棧中,包括整個陣列?

在大多數情況下,更換double *some_pointer會更好嗎?

+0

空間使用效率低下取決於您是否使用分配的空間。如果總是使用整個數組,那麼指針實際上會添加幾個字節的浪費空間來存儲指針本身(即使對於大數組而言可忽略不計)。 – altendky 2014-01-16 18:52:24

回答

7

如果你通過價值是的,它會做一切的副本。 但這就是指針存在的原因。

//Just the address is passed 
void doSomething(struct foo *myFoo) 
{ 

} 
+0

爲了保持儘可能接近傳值的效果,同時仍然可以使用'struct foo const * const myFoo'來獲得通過引用的效率。這會告訴編譯器在您意外地嘗試修改指針或指向值時發出警告。 – altendky 2014-01-16 18:50:10

0

是的,在C語言中,由於效率原因,通常會傳遞一個指向結構的指針。

2

被傳遞作爲參數它將被複制,這是傳遞結構,特別是大的非常低效的方式。但是,基本上,結構體是通過指針傳遞給函數的。

之間
double some_big_array[VERY_LARGE_NUMBER]; 
double *some_pointer 
選擇僅在計劃設計和如何這個字段/結構將被使用而定。後者允許使用可變大小的存儲,但可能需要動態分配。

+0

+1由於無動於衷downvote – 2010-09-14 09:20:25

0

在結構中使用數組有很多原因。其中的一個事實是,結構是通過值傳遞給函數的,而數組是通過引用傳遞的。也就是說,這個結構可能傳遞給帶指針的函數。

1

正如其他人所說的那樣,這種類型的對象通常會使用指針傳遞(總是sizeof (struct foo)字節,通常是4個字節)。

您還可以看到「結構黑客」(也通過與周圍指針):

struct foo { 
    int some_innocent_variables; 
    double some_array[]; /* C99 flexible array member */ 
    /* double some_array[1]; ** the real C89 "struck hack" */ 
} 

這種「結構黑客」獲取由malloc調用大小的數組。

/* allocate an object of struct foo type with an array with 42 elements */ 
struct foo *myfoo = malloc(sizeof *myfoo + 42 * sizeof *myfoo->some_array); 
/* some memory may be wasted when using C89 and 
    the "struct hack" and this allocation method */ 
0

編輯:只要你通過引用(使用指針)傳遞它,結構是好的。

Offtopic: 小心結構破解,因爲它是not strictly standard compliant;它忽略了自動填充。儘管如此,Unix IPC消息隊列使用它(參見struct msgbuf),並且幾乎可以肯定地使用任何編譯器。

也就是說,使用該結構的函數可能會使用指針而不是使用副本。