为什么在调试 realloc 时会出现错误?

Why am I getting errors when debugging realloc?

int *dynArr(int* arr, int n, int isEven) {
    int count = 0;
    int* t = (int*)calloc(n, sizeof(int));
    assert(t);
    if (isEven == 1) {
        for (int i = 0; i < n; i++) {
            if (arr[i] % 2 == 0) {
                t[count++] = arr[i];
            }
        }
    }
    t = (int*)realloc(*t, count * sizeof(int));
    return t;
}

void main() {
    int a[] = { 1,8,3,6,11 };
    int n = sizeof(a) / sizeof(int);
    int isEven = 1;
    int* arr = dynArr(a, n, isEven);
    for (int i = 0; i < n; i++) {
        printf("%d", arr[i]);
    }
}

问题是当我返回数组时我没有得到任何输出,当我调试时我得到这个错误:“[=14= 中 0x7A08B54D (ucrtbased.dll) 处出现未处理的异常]:0xC0000005:访问冲突读取位置 0x00000004。” 有人知道我该如何解决这个问题?

首先,您向 realloc 传递了错误的参数。如果您一直在使用编译器的警告,这很容易被发现。

另一个主要问题是您正在访问 arr 指向的数组的 n 个元素,但它没有 n 个元素。

由于您有两个 return 的值,您将需要 return 通过参数(或 return 一个结构)。

// Returns 0 on success.
// Returns -1 and sets errno on error.
int filter_even_or_odd(
    int **filtered_arr_ptr,  // The address of a variable that accepts output.
    size_t *filtered_n_ptr,  // The address of a variable that accepts output.
    int *arr,
    size_t n,
    int keep_even            // Keep even or keep odd?
) {
    size_t filtered_n = 0;
    int *filtered_arr = malloc( sizeof(int) * n );
    if (!filtered_arr)
        return -1;

    int to_keep = keep_even ? 0 : 1;
    for ( size_t i = 0; i < n; i++ ) {
        if ( arr[i] % 2 == to_keep ) {
            filtered_arr[ filtered_n++ ] = arr[i];
        }
    }

    int *tmp = realloc( filtered_arr, sizeof(int) * filtered_n );
    if (tmp)
        filtered_arr = tmp;

    *filtered_arr_ptr = filtered_arr;
    *filtered_n_ptr   = filtered_n;
    return 0;
}