2017-03-20 107 views
-2
typedef struct 
{ 
    long nIndex;      // object index 
    TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; 

    }structItems; 

void method1(LPCTSTR pInput, LPTSTR pOutput, size_t iSizeOfOutput) 
{ 
    size_t  iLength = 0; 

    iLength = _tcslen(pInput); 
    if (iLength > iSizeOfOutput + sizeof(TCHAR)) 
    iLength = iSizeOfOutput - sizeof(TCHAR); 

    memset(pOutput, 0, iSizeOfOutput); // Access violation error 
} 

void main() 
{ 
    CString csSysPath = _T("fghjjjjjjjjjjjjjjjj"); 
    structItems *pIndexSyspath = nullptr; 
    pIndexSyspath = (structItems *)calloc(1, sizeof(structItems) * 15555555); //If i put size as 1555555 then it works well 
    method1(csSysPath, pIndexSyspath[0].path, (sizeof(TCHAR) * (3 *  MAX_TEXT_FIELD_SIZE))); 
} 

這是導致崩潰的示例代碼。存儲區訪問衝突錯誤

  • 在上面的代碼,如果我們把1555555的大小,那麼它效果很好(我隨機減少大小的數字)。
  • 這是16GB的RAM在64位操作系統贏運行

我懇請一些人幫助我理解釋放calloc之間的不良和關係的原因32位應用程序 - 大小 - memset的。

+0

您是否檢查過分配*工作*,calloc沒有返回空指針? –

+0

如果你使用C++編程,爲什麼要使用'typedef'和'calloc'? –

+0

更重要的是,爲什麼使用'memset'將內存設置爲零?你不知道['calloc'](http://en.cppreference.com/w/cpp/memory/c/calloc)已經做到了嗎?使用'calloc'相當於'malloc'後面跟'memset'。 –

回答

1
typedef struct 
{ 
    long nIndex; // 4 bytes on Windows 
    TCHAR path[3 * MAX_TEXT_FIELD_SIZE]; // 1 * 3 * 255 bytes for non-unicode 
} structItems; 

假設非unicode的,TCHAR是1字節,MAX_TEXT_FIELD_SIZE是255,所以sizeof(structItems)255*3 + 4,這是一個結構769字節。現在,您要分配sizeof(structItems) * 15555555,這比11GiB多。 2GiB如何適用於32位處理器。