【发布时间】:2021-11-13 09:12:58
【问题描述】:
我正在尝试根据用户输入分配一个新的“多维”数组,然后使用用户提供的值填充该数组。之后应该打印内容。数组似乎分配正确,但内部循环只能在崩溃前向新分配的数组写入一个值。
如果我理解正确,多维数组中的所有值都存储在一行中。这就是我选择这种访问数组单元格的方式的原因。
有人能解释一下为什么代码不能按预期工作吗?实现相同目标的正确方法/最佳做法是什么?
我假设我可以以“经典”方式做到这一点——分配一个指针数组,然后为每个指针分配一个数组。这可能行得通,但不能回答为什么顺序访问不是一个可行选项的问题。
#include <stdio.h>
#include <stdlib.h>
int input(int **arr, int *len_x, int *len_y);
int output(int *arr, int *len_x, int *len_y);
int main()
{
int *array;
int length_x;
int length_y;
input(&array, &length_x, &length_y);
output(array, &length_x, &length_y);
return 0;
}
int input(int **arr, int *len_x, int *len_y) {
scanf("%d %d", len_x, len_y);
*arr = malloc(*len_y * *len_x * sizeof(int));
for(int x = 0; x < *len_x; x++){
for(int y = 0; y < *len_y; y++) {
scanf("%d", arr[x * *len_y + y]);
}
}
}
int output(int *arr, int *len_x, int *len_y) {
for(int x = 0; x < *len_x; x++){
for(int y = 0; y < *len_y; y++) {
printf("%d", arr[x * *len_y + y]);
}
printf("\n");
}
}
【问题讨论】:
-
scanf("%d", arr[x * *len_y + y]);->scanf("%d", &((*arr)[x * *len_y + y]));或scanf("%d", *arr + (x * *len_y + y)); -
Kriill,
array[0]包含x,y = 0, 0处的值。array[1]是否应该包含x,y = 0, 1或x,y = 1, 0的值?见@chqrlie。
标签: arrays c pointers multidimensional-array scanf