C指针更改但不修改

mbzjlibv  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(107)

我得到了一些奇怪的指针相关的错误,我不知道怎么会发生,如何解决它。因为我是新的C任何良好的编码实践建议也是赞赏。

typedef struct matrix {
    int n;
    int m;
    int **data;
    int *inverses;
} Matrix;

Matrix m_new(int n, int m, int *inverses) {

    int **data = malloc(n);

    for (int k = 0; k < n; k++) {
        int *row = malloc(m + 1);
        *row++ = k;
        *(data+k) = row; 
        // print_arr(*data); - introduced for debugging purposes
    }

    Matrix mat = {
        .n = n,
        .m = m,
        .data = data,
        .inverses = inverses,
    };

    return mat;
}

void print_arr(int *arr) {
    int len = *(arr-1);
    printf("len: %d\n", len);
}

在这里,我将使用这个矩阵对整数模进行高斯消去,这就是为什么我使用了inverses数组,并且我使用了int **,这样我可以在以后轻松地交换行。对于用int *表示的数组,我使用第-1项来存储数组的长度。我遇到了一些奇怪的错误,所以我写了一个小函数来获取一个数组的长度(print_arr),并检查data中的第一个数组。
镜头:0
镜头:0
镜头:0
镜头:0
镜头:-1219680380
我觉得很奇怪,因为在上一次迭代中似乎有些东西在改变,但我不知道为什么。

1hdlvixo

1hdlvixo1#

分配的内存太小。您需要将元素的数量乘以元素的大小来计算要分配的内存大小:

int **data = malloc(n * sizeof (int *));

int *row = malloc((m + 1) * sizeof (int));

使用当前的代码,您会溢出太小的缓冲区并导致未定义的行为。

相关问题