我认为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;
答案 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;