C填充二维数组

时间:2018-10-29 19:31:55

标签: c segmentation-fault

我正在从事c项目。我需要用数字填充此数组。但是当我尝试这样的事情时,它会产生细分错误。您有什么建议?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  int **my2DArray;

  my2DArray = malloc(4 * sizeof(int));

  for(int i=0; i<4; i++) {
    my2DArray[i] = malloc(5 * sizeof(int));
  }

  for(int i=0; i<4; i++) {
    for(int j=0; j<5; j++) {
      my2DArray[i][j] = 1;
    }
  }

  for(int i=0; i<4; i++) {
    for(int j=0; j<5; j++) {
      printf("%d", my2DArray[i][j]);
    }
  }

  for(int i=0; i<4; i++) {
    // error happens here
    free(my2DArray[i]); 
  }

  free(my2DArray);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

  

它给出了分割错误。

sizeof(int)不是int **my2DArray指向的类型的大小。
 my2DArraypointer to pointer to int,因此指向int *
可能在OP的平台上,intint*小。

  

您有什么建议?

而不是花精力编码匹配类型(并可能会弄错),而是将大小设置为取消引用的指针。正确编码,检查和维护更容易。

int **my2DArray;

// my2DArray = malloc(4*sizeof(int));
my2DArray = malloc(sizeof *my2DArray * 4);  // no type needed
//                 ^---------------^        // Size of the de-referenced type

严格的代码将检测分配失败

my2DArray = malloc(sizeof *my2DArray * element_count);
if (my2DArray == NULL && element_count > 0) {
  // Handle out-of-memory in some fashion
  fprintf(stderr, "Out of memory\n");
  exit (EXIT_FAILURE);
}