簡體   English   中英

C緩沖區內存分配

[英]C buffer memory allocation

我對C很陌生,所以請忍受我的無能。 我想將整個EXEcutable文件讀入緩沖區:

#include <stdlib.h>
FILE *file = fopen(argv[1], "rb");
long lSize;

fseek(file, 0, SEEK_END);
lSize = ftell(file);
fseek(file, 0, SEEK_SET);

char *buffer = (char*) malloc(sizeof(char)*lSize);
fread(buffer, 1, lSize, file);

該文件有6144個字節(在lSize中正確存儲)但我的緩沖區大小只有4個字節,因此只有MZ簽名存儲在緩沖區中。

為什么malloc在這種情況下只分配4個字節?

編輯:可能是char緩沖區由PE文件的MZ頭中的前0個終止。 但是,如果我將緩沖區設置為某個值,則將存儲整個文件。 如果我將緩沖區設置為int(= 4字節),緩沖區將不會被終止,但當然會更大(相對於char = 1字節)。 我只想復制帶有空字節的字節的文件字節。

編輯2:緩沖區當然包含應有的一切,但如果我嘗試用fwrite將其寫入新文件,它只會寫入第一個\\ 0(即4個字節)。 我剛搞錯了。 修正了這一點 對不起,問題還不夠明確。

如果lSize確實等於6144那么你的代碼確實會分配6144個字節,然后讀取文件的全部內容。 如果您認為只讀取了4個字節,則可能是因為第5個字節為零。 因此,當緩沖區被解釋為零終止字符串時,它將在該點終止。

您可以通過查看buffer[4]buffer[5]等來檢查緩沖區的其余部分。

順便說一句,您不需要從malloc返回值,而sizeof(char) == 1的定義。 最佳做法是像這樣編寫malloc

char *buffer = malloc(lSize);

但這不會改變你的結果。

為什么malloc在這種情況下只分配4個字節?

因為你沒有#include <stdlib.h> (並且轉換了malloc()的返回值)。


不要忘記#include <stdlib.h>以便編譯器知道malloc返回一個void*類型的值(而不是假設它返回一個int )並且接受一個size_t類型的參數(而不是asuuming它是一個int

也不要malloc的返回值 void*類型的值可以分配給指針(對任何類型)類型的對象。 轉換返回值會使編譯器以靜默方式將int (在未包含<stdlib.h>時假設)轉換為強制轉換中的類型。 請注意編譯器會在沒有演員的情況下抱怨讓你知道你忘記了包含。


真正的錯誤不是malloc分配錯誤的金額(我相信它會分配正確的金額)。 真正的錯誤是假設malloc在返回void *時返回一個int。 intvoid*可以不同的方式傳遞(一個在寄存器中,另一個在堆棧上)或者它們有不同的表示形式( int兩個補碼和void*分段地址)或任何其他東西(最可能是sizeof (int) != sizeof (void*) )。

你是如何檢查緩沖區的大小的,你在做sizeof(buffer)嗎? 在這種情況下,您只看到pointer to intpointer to int的大小,即4個字節。 你無法從它的指針中獲得緩沖區的大小。 您必須單獨存儲它(在lSize )。

如果malloc()沒有返回NULL那么你的緩沖區很好,大小正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM