[英]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.