2017-03-20 84 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位处理器。