【问题标题】:Creating a matrix in C在 C 中创建矩阵
【发布时间】:2018-06-08 09:51:55
【问题描述】:

我正在尝试创建一个动态矩阵,其中包含用户介绍的行数和 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 };
    }
}

【问题讨论】:

  • matriz = (int **)malloc(n_lines * 6 * sizeof(int *)).. 你确定int *
  • 我建议每次分配指针时打印指针(而不是它们指向的内容,例如matriz[i][0]),即在内部循环中,n_lines > 2。我敢打赌,结果会让您大吃一惊。
  • 是的,我理解你提到的两种情况,并决定使用第一种。

标签: c matrix dynamic dynamic-arrays


【解决方案1】:

程序崩溃是因为您访问大块内存,就好像您分配了锯齿状分配的数组,但实际上并非如此,从而导致无效的内存访问进而使您的程序崩溃。

嗯,从我所见 - 你搞砸了类型。有两种方法可以解决这个问题。

  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
    }
    
  2. int *matriz = malloc(6*nlines*sizeof *matriz);
    // error check 
    matriz[r*6+c] = ... // accessing r-th row c-th column.
    

根据 case-1,它将是

matriz[i][j] =  current_year ;

在 case-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 指向它的开头。这就是为什么您必须首先访问元素并为其计算正确的索引。

【讨论】:

  • 非常感谢@coderredoc,我也很欣赏你的解释
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2021-12-17
  • 2018-12-09
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多