繁体   English   中英

C指针改变而不修改它

[英]C pointer changes without modifying it

我收到一些奇怪的与指针相关的错误,我不明白为什么会发生以及如何解决它。 由于我是 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);
}

在这里,我将使用这个矩阵对整数模数进行高斯消除,这就是为什么我有逆数组,我使用int ** ,这样我以后可以轻松交换行。 对于表示为int *的数组,我使用第 -1 个条目来存储数组的长度。 我遇到了一些奇怪的错误,所以我写了一个小函数来获取数组的长度 (print_arr) 并检查数据中的第一个数组。 我得到以下信息(对于 n=m=5):

长度:0
长度:0
长度:0
长度:0
长度:-1219680380

我觉得这很奇怪,因为在上一次迭代中似乎发生了一些变化,但我不知道为什么。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM