我正在使用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。