在realloc期间阅读位置时发生访问冲突

y0u0uwnf  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(255)

我有一个数组的长度,和两个浮点动态数组。

int arraysizeX_right_ref = 0;
float* X_right_ref = 0;
float* Y_right_ref = 0;
int tolerance = 19;

grabResult.SizeX = 1440
grabResult.SizeY = 1080
我有这个代码下面在一个双循环。当变量arraysizeX_right_ref达到值303时,第一行给出错误:Unhandled exception at 0x00007FF68598FBEF in SimpleGrab.exe: 0xC0000005: Access violation reading location 0x0000014DAA644000

for (l = 845 + tolerance+1; l < grabResult.SizeX; l++) {
    for (j = grabResult.SizeY; j > -1; j--) {
        if (*(img + j * grabResult.SizeX + l) == 0) {
            X_right_ref = realloc(X_right_ref, ++arraysizeX_right_ref * sizeof(*X_right_ref));
            Y_right_ref = realloc(Y_right_ref, arraysizeX_right_ref * sizeof(*Y_right_ref));
            X_right_ref[arraysizeX_right_ref - 1] = l;
            Y_right_ref[arraysizeX_right_ref - 1] = j;
            break;
            }
        }
    }

我猜测它甚至在递增++arraySizeX_right_ref之前就停止了,因为X_right_ref[302],也就是X_right_ref[303-1]有一个可预期的值(Y_right_ref[302]也是如此)。
发生什么事了?

PS:我可能已经诱导大家在一个错误(?),不确定。在VisualStudio中,错误符号实际上出现在if的前面,就在这些重新分配之前。现在我猜问题是访问***img。**

bzzcjhmw

bzzcjhmw1#

1.请使用正确的型号。
1.检查realloc是否未发生故障。您需要使用临时指针。
1.++函数调用中的一些东西看起来很酷,但很难阅读,而且容易出错。不要保存键盘。人们过去常常保存纸张(40年前),因为所有的程序都打印在纸上,数字行可能很重要。

size_t addValue(float **x, size_t size, float j)
{
    float *tmp = realloc(*x, (size + 1) * sizeof(**x));
    if(tmp) 
    {
        *x = tmp;
        tmp[size] = j;
        size += 1;
    }

    return size;
}

int main(void)
{
    size_t arraysizeX_right_ref = 0;
    size_t arraysizeY_right_ref = 0;
    float *X_right_ref = NULL;
    float *Y_right_ref = NULL;

    for(size_t i = 0; i < 1000000; i ++)
    {
        size_t newsize = addValue(&X_right_ref, arraysizeX_right_ref, 10.0f);
        if(newsize == arraysizeX_right_ref) { printf("Xarray allocation error\n"); return 1;}
        else arraysizeX_right_ref = newsize;
        newsize = addValue(&Y_right_ref, arraysizeY_right_ref, 5.0f);
        if(newsize == arraysizeY_right_ref) { printf("Yarray allocation error\n"); return 1;}
        else arraysizeY_right_ref = newsize;
    }
    printf("All was good\n");
    free(X_right_ref);
    free(Y_right_ref); 
}

https://godbolt.org/z/os6eTqbn6

相关问题