繁体   English   中英

malloc指针函数传递fread

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

内部main()

    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 ,而无需重复输入类型名称。
  • 如果您已经知道文件的长度,则将其传递给函数,这样就无需两次计算。
  • 在C语言中,请勿malloc()的返回值。
  • 在进行内存分配和I / O时检查错误,这可能会导致失败。

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 *bufferchar *
  • malloc中,当您应该使用length * sizeof(w_char_t)时,您正在分配一个大小为length*2的块。 不要对类型的大小做任何假设(甚至写sizeof(char)都没问题,这使意图很明确)
  • for循环从0到length ,但是由于buffer被定义为char的缓冲区,因此仅会初始化length个字节,而分配的length*2个字节则使缓冲区的一半仍未初始化。
  • memset()已定义为避免这种for循环...

编码时请多加注意!

首先几个尼特:

  • 什么是malloc和free? new和delete有什么问题? 您显然是在这里编写C ++, 因此请编写C ++
  • 在wchar_t的情况下,重载fopen,fseek,fread极大地困扰着我。 更好:使用模板或定义自己的功能。 不要重载属于C的名称。

这不是一成不变的。 以下几乎可以肯定没有做您想做的事:

fread(&buffer,_length,sizeof(chr),_file_pointer);

这里的chr是指向引用的指针,因此sizeof几乎可以肯定是32或64。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM