这段代码中的段错误在哪里?

时间:2010-10-28 14:14:15

标签: c

我认为malloc分配不当,为什么?

 int ** array;
  int i,j;

  array=malloc(10*sizeof(int *));

  for(i=0; i<10; i++)
    for (j=0;j<10; j++)
        array[i][j]=i*j;

4 个答案:

答案 0 :(得分:7)

你有一个二维数组,所以你需要分配足够的空间来容纳100个元素。或者,您需要在将行放入该行之前分配每列(每行)。如果数组是一个锯齿状数组,每行有不同数量的元素,我只会做后者。

array=malloc(100*sizeof(int)); 

for(i=0; i<10; i++) 
  for (j=0;j<10; j++) 
    array[i*10+j]=i*j; 

array=malloc(10*sizeof(int *)); // rows

for(i=0; i<10; i++) {
  array[i] = malloc(10*sizeof(int));  // columns
  for (j=0;j<10; j++) 
      array[i][j]=i*j;
}

答案 1 :(得分:6)

应为malloc(10*10*sizeof(int));

有两种方法可以在c中创建2d数组:使用连续内存或使用指针数组。在第一种情况下,你malloc 10 * 10个连续元素和访问是这样完成的:array[i][j] = *(array + i*10 + j) = array[i*10 + j](不要忘记硬编码常量是闻到的)。在其他情况下,您malloc 10个int*类型的元素,然后您malloc行循环。然后像array[i][j] = *(*(array + i) + j)

那样访问

答案 2 :(得分:3)

问题是你的数组是10x10 = 100个元素,但你malloc只有10个元素的空间(顺便说一句,上面的注释是正确的:malloc for sizeof(int),而不是sizeof( int *)因为int是您实际想要存储在数组中的内容。)

如果您将malloc更改为

malloc(100 * sizeof(int))

然后你应该没事。

编辑:刚刚注意到你将其声明为int **。对于像这样的矩形数组,您可以将其声明为int*并按(j * 10 + i)进行索引。否则,您将必须malloc第一个维度,然后malloc每个条目为第二个维度。这很慢并容易出错,所以最好使用j*10+i方法。

答案 3 :(得分:0)

您为第一个维度分配了内存,但没有为第二个维度分配内存。

size_t rows = 10;
size_t cols = 10;
int **array = malloc(sizeof *array * rows); // allocates array of 10 int *
if (array)
{
  size_t i;
  for (i = 0; i < rows; i++)
  {
    array[i] = malloc(sizeof *array[i] * cols); // allocates array of 10 int
    if (array[i])
    {
      size_t j;
      for (i = 0; i < cols; i++)
        array[i][j] = i * j;
    }
  }
}

请注意,这不会分配连续的内存块;如果你需要所有100个元素是连续的,你有几个选择:

选择1:分配一维阵列并手动计算偏移,正如其他几个人所示;

选择2:分配1-D数组并使用数组指针和一些魔法使其看起来像一样的二维数组:

#define COLS 10

size_t rows = 10;
size_t cols = COLS;
int *array = malloc(sizeof *array * rows * cols);
int (*parr)[COLS] = (int (*)[COLS]) array;
if (array)
{
  size_t i, j;
  for (i = 0; i < rows; i++)
    for (j = 0; j < cols; j++)
      parr[i][j] = i * j;
}

缺点是要声明指针你必须知道你正在使用多少列,而对于C89,你必须使用一个编译时常量表达式用于列维度,这种方式会破坏动态的目的分配(使用cols变量不起作用,除非您使用的是C99编译器)。

选择3:如果您使用的是C99,则可以使用VLA并完全避免使用malloc(以及随附的free):

int rows = ROWS;
int cols = COLS;

int array[rows][cols];

for (int i = 0; i < rows; i++)
  for (int j = 0; j < cols; j++)
    array[i][j] = i * j;