[英]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。 int
和void*
可以不同的方式傳遞(一個在寄存器中,另一個在堆棧上)或者它們有不同的表示形式( int
兩個補碼和void*
分段地址)或任何其他東西(最可能是sizeof (int) != sizeof (void*)
)。
你是如何檢查緩沖區的大小的,你在做sizeof(buffer)
嗎? 在這種情況下,您只看到pointer to int
的pointer to int
的大小,即4個字節。 你無法從它的指針中獲得緩沖區的大小。 您必須單獨存儲它(在lSize
)。
如果malloc()
沒有返回NULL
那么你的緩沖區很好,大小正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.