[英]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.