2015-06-29 25 views
3

的我喜歡爾德沉降約memset的正確使用的參數。Ç約定 - 如何在一個結構歸零的陣列字段(語言是C)當在陣列字段中使用memset的一個結構

讓我們說,我們有以下結構:

struct my_struct { 
     int a[10] 
    } 

以下哪實現更正確?

選項1:

void f (struct my_struct * ptr) { 
    memset(&ptr->a, 0, sizeof(p->a)); 
} 

選項2:

void f (struct my_struct * ptr) { 
     memset(ptr->a, 0, sizeof(p->a)); 
} 

注:

如果該字段是一個基本類型或另一個結構(如 'INT')的選項2不起作用,如果它是一個指針(int *),選項1將不起作用。

請指教,

+1

對您希望歸零的元素的類型使用正確的符號。你已經確定了所需的兩個符號;沒有一種符合所有情況的符號。對於數組,你不使用'&';對於其他任何事情你都這樣做。 –

+1

如果'a'是一個指針,兩個選項都不會起作用,兩者都會默默地給出錯誤的行爲。 –

回答

1

對於非複合型,你不會用memset可言,因爲直接分配會更容易和更快的可能。它也將允許編譯器優化函數調用不。

對於數組,變體2可以工作,因爲數組被隱式轉換爲大部分操作的指針。

對於指針,請注意,在變體2中的指針的值使用,而不是指針本身,而對於一個陣列,指針到陣列被使用。

變體1產生對象本身的地址。對於一個指針來說,就是指針的指針(如果這個「工作」取決於你的意圖),對於一個數組,它就是數組的數組 - 它恰好總是它的第一個元素的地址 - 但這裏的類型不同(無關緊要,因爲memset需要void *並在內部轉換爲char *)。

所以:這取決於;對於一個數組,我沒有看到實際上有太大的差別,除了地址操作符可能會混淆不符合操作符優先級的讀取操作(而且它更像是鍵入)。作爲個人觀點:我更喜歡簡單的語法,但不會抱怨其他語言。

請注意,memset0之間的任何其他值實際上沒有多大意義;它甚至可能不保證將指針數組解釋爲空指針

1

國際海事組織,選項1是可取的,因爲同樣的模式適用於任何對象,而不僅僅是陣列:

memset(&obj, 0, sizeof obj); 

你可以從這個聲明只是告訴它不會導致緩衝區溢出 - 即不訪問出界。這仍然可能不會達到預期的目的(例如,如果obj是一個指針並且它打算設置指針指向的內容),但至少包含了損壞。

但是,如果你不小心在指針上使用memset(p, 0, sizeof p),那麼你可能會寫過指向對象的末尾;或者如果對象大於sizeof p,則會使對象處於奇怪的狀態。