arrays - 在函数内重新分配和操作二维数组
问题描述
我正在尝试重新分配 2D 数组的两个元素,并在同一函数中操作 2D 数组中的值。但我似乎无法让它工作。在编译代码时不会显示任何错误,但在运行时它只会打印我initial_size
在函数开头指定的行main
数。
所以看起来内部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
在外循环中时,您将指针的数量从两个(在 中创建的main
)增加到四个。
两个指针的值main
被复制到新的内存区域。
两个新指针的值是不确定的,这就是你的问题。您永远不会通过分配内存来初始化它们 - 但是您在另一个循环中使用它们。
此外,您似乎是realloc
单独的内部数组维度,但您只跟踪一个长度(即len2
)。这也是一个问题。
并且len2 = 2
循环之间的线是错误的,因为您丢失了有关先前分配的内存的信息。
推荐阅读
- docker - 来自 Jenkins 的 ecr 登录返回未知标志:--password-stdin
- sqlite - dotnet ef 数据库更新命令失败
- amazon-web-services - IAM 用户下载的 AWS S3 数据量
- python - 将 BeautifulSoup 标签转换为 json
- oauth - 我应该在哪里保存日历 API 令牌?
- html - 如何使用反应形式方法为垫子下拉菜单选择默认值
- javascript - 删除行 HTML
- c++ - C++ 有提升类吗?
- c++ - 在派生类构造函数中传递抽象类指针时出错
- node.js - Angular 后端配置上的电子邮件 - Emailjs