【发布时间】:2021-02-09 10:43:08
【问题描述】:
我正在尝试重新分配 2D 数组的两个元素,并在同一函数中操作 2D 数组中的值。但我似乎无法让它工作。编译代码时不会显示任何错误,但在运行时它只会打印我在 main 函数开头指定为 initial_size 的行数。
所以看起来内部realloc 工作正常,因为它总是在启动后打印一整行。但是外部的realloc 不起作用,因为它只会打印几行。
注意:真实代码从getchar()/scanf()获取未知大小的输入。这就是为什么 realloc 函数在函数的循环内。
函数的简化版本,省略了错误处理:
void func(int ***A) {
int i, j;
int len = 2;
int len2 = 2;
for (i = 0; i < 10; i++) {
// Check to see if a realloc is needed.
if (i >= len) {
len *= 2;
int **tmp = realloc(*A, len * sizeof(int*));
*A = tmp;
printf("Len1 = %d\n", len);
}
len2 = 2;
for (j = 0; j < 20; j++) {
// Check to see if a realloc is needed.
if (j >= len2) {
len2 *= 2;
int *new_row = realloc((*A)[i], len2 * sizeof(int));
(*A)[i] = new_row;
}
// Assign value.
(*A)[i][j] = i * j;
}
}
}
int main() {
int i, j;
int initial_size = 2;
int **A;
// Malloc with a starting size of 2 (could be any size).
A = malloc(initial_size * sizeof(int*));
for (i = 0; i < initial_size; i++) {
A[i] = malloc(initial_size * sizeof(int));
}
// Call function.
func(&A);
// Print the results, row by row.
for (i = 0; i < 10; i++) {
for (j = 0; j < 20; j++) {
printf("%d, ", A[i][j]);
}
printf("\n");
}
return 0;
}
我已经被困了一段时间,所以非常感谢任何帮助:)
【问题讨论】:
-
为什么在循环中调用
realloc(*A, len * sizeof(int*))?总体而言,此代码似乎不必要地复杂。 1. 计算新大小,2. 重新分配,3. 完成。 -
Realloc 处于循环中,因为真正的代码正在处理未知大小的输入。所以它会重新分配数据并将数据放入同一循环中的数组中。
-
@AstonKey:您可以通过点击分数下方的灰色复选标记来接受答案。
标签: arrays c multidimensional-array malloc realloc