任何人都可以帮我调试这个2D阵列吗?

时间:2012-08-14 03:21:30

标签: c hash

我正在尝试增加2D数组的大小,而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;

1 个答案:

答案 0 :(得分:1)

如果可以调整大小,你没有2D数组,你有一个指向int的指针。

数组:

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

可变大小的2D“数组”:

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)将2D数组视为一维数组列表

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

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

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

#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是固定的长度)。