[英]malloc pointer function passing fread
無法弄清楚出了什么問題,我似乎並沒有從恐懼中得到任何東西。
#pragma once
#ifndef _PORT_
#define _PORT_
#include <string>
#ifndef UNICODE
typedef char chr;
typedef string str;
#else
typedef wchar_t chr;
typedef std::wstring str;
inline void fopen(FILE ** ptrFile, const wchar_t * _Filename,const wchar_t * _Mode)
{
_wfopen_s(ptrFile,_Filename,_Mode);
}
#endif
#endif
File * f = new File(fname,FileOpenMode::Read);
chr *buffer;
buffer = (wchar_t*)malloc(f->_length*2);
for(int i=0;i<f->_length;i++)
{
buffer[i] = 0;
}
f->Read_Whole_File(buffer);
f->Close();
for(int i=0;i<f->_length;i++)
{
printf("%S",buffer[i]);
}
free(buffer);
void Read_Whole_File(chr *&buffer)
{
//buffer = (char*)malloc(_length);
if(buffer == NULL)
{
_IsError = true;
return;
}
fseek(_file_pointer, 0, SEEK_SET);
int a = sizeof(chr);
fread(&buffer,_length ,sizeof(chr) , _file_pointer);
}
您正在各處混合使用指針和引用。
您的函數只需要使用一個指向緩沖區的指針:
void Read_Whole_File(char *buffer) { ... }
並且您應該將指針原樣傳遞給fread()
,不要使用指針的地址:
size_t amount_read = fread(buffer, _length, sizeof *buffer, _file_pointer);
還請記住:
ptr
,則可以使用sizeof *ptr
,而無需重復輸入類型名稱。 malloc()
的返回值。 buffer
是對chr *
的引用。 然而,您正在讀入&buffer
,它是一個chr **(無論是什么)。 錯誤。
您甚至不需要傳遞對Read_Whole_File
buffer的Read_Whole_File
,只需使用常規指針即可。
除了您原來的問題...
從您的代碼:
typedef char chr;
chr *buffer;
buffer = (wchar_t*)malloc(f->_length*2);
for(int i=0;i<f->_length;i++)
{
buffer[i] = 0;
}
您不覺得這里有問題嗎? 如果您無法發現錯誤,請參閱以下列表:
chr
是一個char
,所以buffer
是一個char *
malloc
。 您是用C還是C ++編碼? 如果是C ++,請考慮使用new
wchar_t *
但buffer
是char *
malloc
中,當您應該使用length * sizeof(w_char_t)
時,您正在分配一個大小為length*2
的塊。 不要對類型的大小做任何假設(甚至寫sizeof(char)
都沒問題,這使意圖很明確) for
循環從0到length
,但是由於buffer
被定義為char
的緩沖區,因此僅會初始化length
個字節,而分配的length*2
個字節則使緩沖區的一半仍未初始化。 memset()
已定義為避免這種for
循環... 編碼時請多加注意!
首先幾個尼特:
這不是一成不變的。 以下幾乎可以肯定沒有做您想做的事:
fread(&buffer,_length,sizeof(chr),_file_pointer);
這里的chr
是指向引用的指針,因此sizeof幾乎可以肯定是32或64。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.