【问题标题】:Scanf into multidimensional Array, allocated with mallocScanf 成多维数组,用 malloc 分配
【发布时间】: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", &amp;((*arr)[x * *len_y + y]));scanf("%d", *arr + (x * *len_y + y));
  • Kriill, array[0] 包含 x,y = 0, 0 处的值。 array[1] 是否应该包含 x,y = 0, 1x,y = 1, 0 的值?见@chqrlie

标签: arrays c pointers multidimensional-array scanf


【解决方案1】:

索引

input() 中,int **arr ... arr[x * *len_y + y] 正在索引int * 的数组。代码需要索引int 的数组。另见@kaylum

更清晰的获取数据,然后通过3个参数指针赋值。

缺少返回值

int input() 不返回值。这意味着编译没有在启用所有警告的情况下完成。节省时间,启用所有警告。

尺寸调整

分配给被引用对象的大小。更容易正确编码、审查和维护。

缺少错误检查

检查scanf()malloc() 是否成功。

备用output()

推荐的替代方案 - 更容易理解。

// int output(int *arr, int *len_x, int *len_y) {
void output(const int *arr, int len_x, int len_y) {
//                          ^^^        ^^^ --- pass length, not pointer to length
//          ^^^^^  --------------------------- referenced data does not changed

// Return 0 on success
int input(int **arr, int *len_x, int *len_y) {
  int x,y;
  if (scanf("%d %d", &x, &y) != 2) {
    return 1;
  }

  int *a = malloc(sizeof *a * x * y);
  if (a == NULL) {
    return 1;
  }

  for(int xi = 0; xi < x; xi++) {
    for(int yi = 0; yi < y; yi++) {
      if (scanf("%d", &a[xi * y + yi]) != 1) {
        free(a);
        return 1;
      }
    }
  }

  *arr = a;
  *len_x = x;
  *len_y = y;
  return 0;
}

【讨论】:

  • 循环的顺序似乎不正确:输入值可能应该按行顺序排列?
猜你喜欢
  • 2020-06-06
  • 2021-05-13
  • 2012-08-10
  • 2019-01-26
  • 2023-03-11
  • 2021-03-05
  • 2019-06-07
  • 2020-08-04
相关资源
最近更新 更多