将32位移植到64位C程序“引发异常:读取访问冲突0xC0000005”

时间:2018-10-05 09:47:02

标签: 32bit-64bit calloc

我正在使用VS2017,具有以下C代码行(抱歉,无法发布函数的所有内容):

char        *dptr;                  /* Global variables */
static u_int16_t vers;  
...
static int32_t 
read_row(database_t *dbase, table_t *table, int32_t col_flag, int32_t flag) {

    row_t       *rowptr;
    char        marker;
    void        *new_row;
    table_t     *t_new;
    size_t      row_length;
    size_t      row_ =  1;

    marker = *dptr++;

    if (vers < VERS && marker != ROW) {
        return -1;
    }   

    /* Create a new row */
    t_new = table;
    row_length = t_new->row_length;
    new_row = calloc(row_, row_length);
    rowptr = new_row;
    if (rowptr == NULL)
    return -1;
    ... 

最后一行导致“在****。exe中的0x00000000778745A0(ntdll.dll)处引发异常:0xC0000005:访问冲突读取位置0x00000000787745A0”错误。

在调试期间,当我将指针悬停在calloc上时,我可以看到其值为“ 0x000000013f63dc94”。但是不知何故,将引发异常,并且该值永远不会分配给new_row(其值仍为“ 0xcccccccccccccccccc”)。

我注意到当calloc的值>“ 0x00000001 ********”时抛出此异常。如果地址的8个MSB为0,似乎工作正常。 calloc()的定义来自corecrt.malloc.h:

_Check_return_ _Ret_maybenull_ _Post_writable_byte_size_(_Count * _Size)
_ACRTIMP _CRT_JIT_INTRINSIC _CRTALLOCATOR _CRTRESTRICT
void* __cdecl calloc(
    _In_ _CRT_GUARDOVERFLOW size_t _Count,
    _In_ _CRT_GUARDOVERFLOW size_t _Size
    );

任何有关可能导致此异常以及如何解决此异常的想法都将受到赞赏。顺便说一句,我正在使用具有8GB RAM的Win 7 Pro。

0 个答案:

没有答案