尝试更改C

时间:2019-02-01 08:05:30

标签: c arrays multidimensional-array

我想在make2Darray函数中实现,使2D数组中的元素与行号相对应。

已经给出了打印和释放代码的其他部分,因此无需担心。我只想触摸make2Darray函数。但是,在该函数中,还给出了分配部分。因此,我唯一要修改的代码就是更改2D数组中元素的部分。

int** make2Darray(int width, int height) {
  int **a;
  int i = 0;
  int j = 0;

  /*allocate memory to store pointers for each row*/
  a = (int **)calloc(height, sizeof(int *));
  if(a != NULL) {
    /* allocate memory to store data for each row*/
    for(i = 0; i < height; i++) {
      a[i] = (int *)calloc(width, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, height);
        return NULL; /*aborting here*/
      }
    }
  }
    /* from this point down is the part I implemented, all code above was 
    given*/
    if (height < 0 && width < 0) {
      for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
          a[i][j] = j;
        }
      }
    }
    return a;
}

假设2D数组中的元素对应于行号 如果高度= 4且宽度= 3

0  0  0
1  1  1
2  2  2
3  3  3

但是,我总是得到0,这是我获得代码时的默认设置

0  0  0
0  0  0
0  0  0
0  0  0

2 个答案:

答案 0 :(得分:1)

您在代码中有两个主要问题。

1)初始化2D数组的代码应 if块内部

2)if (height < 0 && width < 0) {是错的-您希望使用>而不是<

尝试:

int** make2Darray(int width, int height) {
  int **a;
  int i = 0;
  int j = 0;

  /*allocate memory to store pointers for each row*/
  a = (int **)calloc(height, sizeof(int *));
  if(a != NULL) {
    /* allocate memory to store data for each row*/
    for(i = 0; i < height; i++) {
      a[i] = (int *)calloc(width, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, height);
        return NULL; /*aborting here*/
      }
    }

    // Moved inside the if(a != NULL) {

    /* from this point down is the part I implemented, all code above was 
    given*/
    if (height > 0 && width > 0) {   // Corrected this part 
      for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
          a[i][j] = j;
        }
      }
    }

  }
  return a;
}

一些提示:

1)在函数开始时检查高度和宽度-如:

if (height <= 0 || width <= 0) return NULL;

2)原型make2Darray(int width, int height)在我看来倒退了,因为我们通常在列数之前提到行数。我希望:make2Darray(int height, int width)。我什至更喜欢用“行”代替“高度”,用“柱”代替“宽度”。

3)您当前的代码在if(a != NULL) {内执行“所有实际工作”,这没关系,但是(对我来说)如果您改为使用if(a == NULL) return NULL;

4)无需投放calloc

通过这些更新,代码可能是:

int** make2Darray(int rows, int columns) {
  int **a;
  int i = 0;
  int j = 0;

  if (rows <= 0 || columns <= 0) return NULL;
  a = calloc(rows, sizeof(int*));
  if(a == NULL) return NULL;

  /* allocate memory to store data for each row*/
  for(i = 0; i < rows; i++) {
      a[i] = calloc(columns, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, rows);
        return NULL; /*aborting here*/
      }
  }

  /* from this point down is the part I implemented, all code above was 
     given*/
  for (i = 0; i < rows; i++) {
      for (j = 0; j < columns; j++) {
          a[i][j] = j;
      }
  }

  return a;
}

答案 1 :(得分:0)

在您的代码中,if检查似乎不合适。

  if(a != NULL) {
    /* allocate memory to store data for each row?
    for(i = 0; i < height; i++) {
      a[i] = (int *)calloc(width, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, height);
        return NULL; /*aborting here*/
      }

嗯,那没有道理。如果成功,则a不等于NULL

您应该先检查a == NULL,然后再检查return NULL;,而不是相反。

说:

  • if (height < 0 && width < 0)看起来不太好。这很可能是错误的(在此用法上下文中)并且适得其反。
  • a[i][j]的所有访问均无效。您只为int *分配了空间,int *本身并不指向任何有效内存。您还需要为其分配内存(例如,使用width作为大小)。