2017-08-17 102 views
1

我在一個庫中有這段代碼,我在想它是什麼,因爲我有內存問題,我想這就是原因。memset(foo-> a + foo-> b,0,10)是什麼意思?

所以一段代碼以下:

int new_size = foo->a_size + 10; 
    foo->a = realloc(foo->a, new_size*sizeof(struct items)); 
    memset(foo->a+foo->a_size, 0, 10); 

foo->a是類型struct items*foo->a_size是類型int

第一線的重新分配新的內存有10個街區,但現在我想知道如果memset()套都foo->afoo->a_size爲0或應該從11-20到0 foo->a這套塊? 我試圖依靠自己運行此代碼塊只接收Segmentation fault

編輯:

問題是,做的memset()同時設置foo->afoo->a_size爲0或它與設定塊偏移foo->a_size0 in foo->a。後面的假設是正確的,但我還需要修正memset(),所以最後一個參數是10 * sizeof(struct items)。我還編輯了從foo->bfoo->a_size的變量名稱。

+3

不管結果,'foo-> A = realloc的(foo->一個,....'是一個相當壞習慣/編碼風格。想象一下,realloc失敗.......... –

+2

'foo-> a'是指向分配內存的指針,'foo-> b'是它的偏移量。可以寫得更清晰,更安全! –

+0

他們真的叫'a'和'b',還是他們有意義的名字? – slim

回答

6

您與偏移foo->bint)初始化在foo->apointer10字節。換句話說,你只是初始化附加內存。

實施例:

讓我們假設foo->aint*和指向5 int s的連續塊。

+---+---+---+---+---+ 
| 0 | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+ 

需要10個int S,所以你會realloc,阻止大小10 * sizeof(int)字節,但追加5 * sizeof(int)字節是未初始化的。

+---+---+---+---+---+---+---+---+---+---+ 
| 0 | 0 | 0 | 0 | 0 | ? | ? | ? | ? | ? | 
+---+---+---+---+---+---+---+---+---+---+ 

這樣做

memset(pointerToFirstByte + Offset, 0, 5 * sizeof(int)); 

你會初始化這些附加字節0

+---+---+---+---+---+---+---+---+---+---+ 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+---+---+ 
         ^---^---^---^---^------ Initialized to 0 
+0

'foo_b'將是偏移量; 'foo-> a + foo-> b'將是一個指針 –

4

有問題的行設置了10個字節,其中foo->b的偏移量從foo->a開始,偏移量爲步長結構項的大小。我們沒有足夠的信息來進一步解釋這一點,但我的推測是,foo-> a是一個指向動態分配結構數組的指針,在這裏我們將它的部分字段(可能是一個元素?)設置爲0

+1

這不是'foo-> b'的字節偏移量。由於指針算術,它是'foo-> b * sizeof(struct items)'的偏移量,不是嗎?所以它會在該地址上設置10個字節。 –

+0

它是foo-> a的偏移量,而不是foo-> b,但是的確如此,它的結構大小將以字節爲單位進行偏移 –

+0

那麼它是否會改變結構11-20或結構21-30? –

-1
memset(foo->a+foo->b, 0, 10); 

這行設置的Foo->的10個字節的到。 foo-> a + foo-> b是其中的偏移值。

3

所以這兩條線foo->a增加了10個地段struct items

int new_size = foo->b + 10; 
foo->a = realloc(foo->a, new_size*sizeof(struct items)); 

這將設置10個字節的通過foo->b * sizeof(struct items)抵消foo->a內存爲0

memset(foo->a+foo->b, 0, 10); 

這是不是可能就足夠,因爲它是不可能struct items的大小隻有1個字節。你應該做的顯然是這樣的10手struct items

memset(foo->a+foo->b, 0, 10*sizeof(struct items)); 
1

在代碼片段的memsetfoo->a0新分配的部分初始化10個字節。此代碼有多個問題:

  • 您不測試realloc()失敗。
  • 您覆蓋foo->a,返回值爲realloc()。如果realloc()失敗,則先前由foo->a指向的塊仍被分配但可能無法訪問,即內存泄漏。
  • 設置爲0的空間很可能太小。
  • 初始化爲所有位0可能不適用於結構items
  • 您不更新foo->size

下面是一個改進版本:

size_t new_size = foo->a_size + 10; 
struct items *newp = realloc(foo->a, new_size * sizeof(*foo->a)); 
if (newp == NULL) { 
    // handle the error 
} else { 
    memset(newp + foo->a_size, 0, (new_size - foo->a_size) * sizeof(*foo->a)); 
    foo->a = newp; 
    foo->a_size = new_size; 
}