i'MAING试图创建一个动态矩阵,并使用用户引入数量的线条和6列。我只想创建矩阵,这样我就可以在需要时获得其值。我已经尝试过,但是该程序到达这里时崩溃了。
matriz = (int **)malloc(n_lines * 6 * sizeof(int *));
for (i = 0; i < n_lines; ++i)
{
for (j = 0; j < 6; ++j)
{
current_year = starting_year + i;
if (current_year % 400 == 0)
{
february = 29;
days = 366;
hours = 8784;
minutes = 527040;
seconds = 31622400;
}
else
{
february = 28;
days = 365;
hours = 8760;
minutes = 525600;
seconds = 31536000;
}
matriz[i][0] = { current_year };
matriz[i][1] = { february };
matriz[i][2] = { days };
matriz[i][3] = { hours };
matriz[i][4] = { minutes };
matriz[i][5] = { seconds };
}
}
程序崩溃了,因为您访问了内存的块,就好像您锯齿状分配的数组一样,导致无效的内存访问,从而使您的程序崩溃。
从我看到的角度来看 - 您弄乱了类型。
-
int **matriz; matriz = malloc(sizeof *matriz*nlines); // error check for(size_t i=0; i<nlines; i++){ matriz[i]= malloc(sizeof *matriz[i] * 6); // error check }
-
int *matriz = malloc(6*nlines*sizeof *matriz); // error check matriz[r*6+c] = ... // accessing r-th row c-th column.
并且基于案例1
matriz[i][j] = current_year ;
,在案例2中类似地
matriz[i*6+j] = current_year;
一般代码结构将为
if (current_year % 400 == 0)
{
...
seconds = 31622400;
}
else
{
...
seconds = 31536000;
}
for (j = 0; j < 6; ++j)
{
matriz[i][j] = current_year ;
...
}
有点解释 - 第一种情况是分配锯齿状的数组。首先是一个指针数组,然后每个指针指向一个6个元素的数组。
第二种情况基本上是在分配具有 6*nlines
int的内存,而 matriz
指向了它的开始。现在,这就是为什么您必须首先访问元素为其计算正确的索引。