我正在尝试使用用户介绍的行数和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 };
}
}
答案 0 :(得分:1)
程序崩溃了,因为你正在访问内存块,好像你没有锯齿状的已分配数组,导致无效的内存访问反过来导致你的程序崩溃。
从我看到的 - 你搞砸了类型。有两种方法可以解决这个问题。
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
指向它的开头。现在,这就是为什么你必须首先为它计算正确的索引才能访问这些元素。