2011-02-23 37 views
3

你好我使用malloc(),以產生這樣的緩存器,其中緩存器是一個char *malloc問題?

buffer = (char*)malloc(chunksize+1); 
    for (k = 0; k < chunksize; k++) { 
    buffer[k] = (char) (j+k); 
    } 

然而,在調試器我可以看到的緩衝液[3]例如爲i寫在炭,但緩衝區緩衝區是空的(很多空間)。但是,第二次在空閒(緩衝區)後寫入緩衝區中的內容時,它會顯示我第一次寫入的內容並覆蓋它。誰能告訴我爲什麼?謝謝!!

+1

什麼是'j'?什麼是「chunksize」?你真的說過「在free(buffer)'」之後寫入緩衝區中的內容嗎? – 2011-02-23 18:57:40

+0

對不起,我的壞。它是在一個循環中,在循環結束時釋放緩衝區,但是我在每次寫入malloc之前都要像顯示的代碼那樣寫入 – user512853 2011-02-23 19:00:02

+0

j只是一個整數 – user512853 2011-02-23 19:00:43

回答

1

一個問題可能是您嘗試使用printf或同等打印char緩衝區?你缺少分配

buffer[chunksize] = 0; 

所以你的緩衝區沒有很好地終止。它可能有任何東西,例如'\r'

如果另一方面buffer不代表您的字符串,最好使用不同的基本類型,可能是unsigned char

+1

這應該是'buffer [chunksize] ='\ 0';'。雖然它們可能具有相同的按位表示,但在使用適當的字面量時,您的意圖更清晰。 – mk12 2012-08-23 17:15:14

+0

這不過是一個品味問題。 ''\ 0''不是'0'的另一個名字。我更傾向於對所有初始化都使用相同的「0」。 – 2012-08-23 17:55:53

+0

空字符串:'buffer [0] ='\ 0';' – alex 2015-08-26 00:13:08

8

一般來說,malloc的實現是通過從OS中獲取大量內存,然後在請求緩衝區時對其進行次分配。這是因爲從操作系統獲取內存相對較慢。

作爲一項安全措施,您的操作系統將給予malloc空白內存(滿0或其他重複值)。你不希望一個進程能夠讀取一個不相關進程的離開。

但是,malloc沒有這樣的問題,因爲它只從該塊到一個進程。如果你能看到你自己的離開(至少不是來自安全POV)並不重要。

所以發生了什麼是你已經mableced緩衝區,並認爲它最初是空白的。然後你已經釋放它並要求「另一個」緩衝區,malloc碰巧又把相同的內存交給了你,這次包含了你留下的值。

這得到相同的內存「巧合」兩次還不是很不可能的,因爲有一個很好的理由malloc重新使用最近使用的內存在可能的情況 - 這更可能是在緩存中。

您可能認爲這對您無關緊要,因爲您通常不會從新分配的內存中讀取數據。但它對malloc很重要,因爲通常malloc會將其自己的管家數據保留在緩衝區旁邊。如果將內存從高速緩存中排出 - 如果您可以「被欺騙」重複使用同一內存,那麼這也可能很重要,那麼這種情況就會少一些。

+0

謝謝。但是爲什麼當我從調試器中檢查緩衝區時不會寫入字符?我打算在之後立即將緩衝區寫入文件。當我從文件中讀取內容時,我得到了很多「32」,這是空間。但第二次,這是正常的。 – user512853 2011-02-23 19:05:58

+0

@ user512853:嗯,我可能誤解了這個問題。我以爲你的意思是你在循環執行時看到空白記憶,用你的值覆蓋('j','j + 1'等)。實際空格字符(即ASCII 32)與調試內存視圖中顯示爲空白的不可打印字符相反,聽起來不太可能用於未初始化的內存。當你寫入文件時,你是否確實寫了與你填寫的相同的塊大小,並從相同的地址開始?在調用'fwrite'之前檢查內存是什麼樣的。 – 2011-02-23 19:11:05

+0

我生成緩衝區,然後將緩衝區寫入文件,釋放緩衝區,再次malloc並重復前面的步驟。之後,我將文件讀入緩衝區,並比較內容是否與我之前寫的內容相同,其中第一個塊滿了32,其他塊都是正確的。 – user512853 2011-02-23 19:15:55

0

您的代碼是正確的。如果你擔心你覆蓋了一些不好的內存,那麼問題可能出現在你沒有顯示的代碼的某些部分。例如,如果緩衝區是指向非字符數組的指針,在這種情況下,您使用的pointer arithmetic將導致內存訪問錯誤(損壞)。您可以使用下面的程序作爲參考:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    const size_t chunksize = 15; 
    size_t k; 
    char *buffer; 

    buffer = malloc (chunksize + 1); 
    memset (buffer, 0, chunksize + 1); 

    for (k = 0; k < chunksize; ++k) 
    { 
     buffer[k] = '0' + (char)k + 49; 
    } 

    for (k = 0; k < chunksize; ++k) 
    { 
     printf ("%lu = %c\n", k, buffer[k]); 
    } 

    free (buffer); 

    return 0; 
} 

輸出:

0 = a 
1 = b 
2 = c 
3 = d 
4 = e 
5 = f 
6 = g 
7 = h 
8 = i 
9 = j 
10 = k 
11 = l 
12 = m 
13 = n 
14 = o