谁能帮我调试这个二维数组?

标签 c hash

我正在尝试增加二维数组的大小,hm 是一个包含数组 x 长度的结构。我使用值 -99999991 来指示数组的结尾。

这是正确的方法吗?

 hm->value = realloc(hm->value,(hm->x+1)*sizeof(int));
            hm->value[hm->x] = malloc(sizeof(int));
            hm->value[hm->x][0] = -999999991;
            hm->value[hm->x-1] = realloc(hm->value[hm->x-1],2*sizeof(int));
            hm->value[hm->x-1][1] = -999999991;
            hm->value[hm->x-1][0] = value;

最佳答案

如果二维数组可以调整大小,那么它就不是一个二维数组,而是一个指向 int 的指针。

数组:

int A[n][m];
Accessing the array: A[2][3] = 4; // Equivalent to *(A + 2*m + 3)

可变大小的二维“数组”:

int **A;
A = malloc(n*m*sizeof(int));
A[2][3] = 4; // Equivalent to *A + 2*??? + 3)

编译器不知道您的数组是否是一维的,或者如果它是二维的,那么这两个维度的大小是多少。已经无法再计算这个了。 另外,realloc 无法将数据放在正确的位置。考虑将 2x2 2D 数组转换为 2x3 2D 数组:

int **A = {{0,1}, {2,3}}; // for berevity - this isn't valid C!
// stored in memory as [0,1,2,3]
A = realloc(A, 2*3* sizeof(int));

内存中存储的新数组为[0,1, , 2, 3, ];这需要复制数据。

有两个不错的解决方案(尽管它们不太漂亮): 1) 将二维数组视为一维数组的列表

int **A;
A = malloc(m*sizeof(void *));
for (i = 0; i < m; ++i) {
    A[i] = malloc (n*sizeof(int);
}

(现在 realloc 应该适用于这两个数组,但访问元素将需要两次指针取消引用而不是指针算术)

2)如果数组的某一维度是固定的,那么我们可以在内存中使用二维数组并根据需要重新分配它。

#define M 16
int **A;
A = malloc(M*n*sizeof(int)); // realloc also works
// access an element:
*(A + 3*M + 2) = 4; // (3*M is compile time constant)

在第二个示例中,我们总是在 2D 数组的末尾增长(因此我从 2x2 到 2x3 的示例是非法的 - 第二个 2 是固定长度)。

关于谁能帮我调试这个二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11945350/

相关文章:

Python Hash MD5 不等于 SQL Server

python - 逐字或按哈希比较 2 段文本

java - 不同的map有相同的hashcode

c++ - 遇到空格时如何停止阅读一行?

c++ - 从父级重定向时,到 stderr 的 DLL 输出不起作用

python - c 程序 SWIG 到 python 给出 'ImportError: dynamic module does not define init function'

c - C 中的关联数组

python - 如何在Python中使用随机哈希函数?

c - 我需要这个队列来显示学生 ID 和姓名,我该如何解决这个问题?

php - PHP 中的双向加密 - 需要一些指导