我正在尝试增加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;
答案 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是固定的长度)。