簡體   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