【问题标题】:Segmentation fault in matrix in CC中矩阵中的分段错误
【发布时间】:2016-12-05 11:17:26
【问题描述】:

我尝试在 C 中创建一个矩阵并有一些输入值,但我不知道为什么它会引发“分段错误”。这是我的代码:

#include <stdio.h> 
#include <stdlib.h>

int main() {
    int i;
    int j;
    int **a;
    a = malloc(5 * sizeof(int));
    for (i = 0; i < 5; i++) {
      a[i] = malloc(4 * sizeof(int));
    }
    for (i = 0; i < 5; i++) {
      for (j = 0; j < 4; j++) {
        scanf("%d", (a[i][j]));
      }
    }
    return 0;
}

【问题讨论】:

  • 应该是scanf("%d", &amp;(a[i][j]));
  • 如果你用 gcc 编译,它会警告你你使用 scanf 错误,解决 gcc 警告通常可以解决很多问题。

标签: c matrix segmentation-fault


【解决方案1】:

鉴于@Bathsheba 的回答,您的代码应该是这样的:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  int (*a)[4] = malloc( sizeof(int[5][4]) );

  for(int i=0;i<5;i++)
  {
    for(int j=0;j<4;j++)
    {
      scanf("%d", &a[i][j]);
    }
  }

  free(a);
  return 0;
}

【讨论】:

  • 赞成。这是“王牌”答案,但我没有足够的信心使用它,尤其是当您必须考虑衰减到指针时。
  • @Bathsheba 数组指针不会衰减。将此数组指针传递给函数时,您只需将函数声明为void func (size_t x, size_t y, int array[x][y])。其中int array[x][y] 将被编译器(“衰减”)调整为指向第一个元素的指针:int (*array)[y]。这正是我们在调用者中所拥有的。
  • 这很有帮助。事实上,这大部分都高于我的工资等级。请随意从我的答案中提取各个方面并将其合并到这个答案中。
  • @Bathsheba Nah,你的回答很好,我只是无法忍受看着你死在里面 :)
【解决方案2】:
  1. a 的分配应该是

a=malloc(5*sizeof(int*));

注意sizof 中的指针类型。在某些系统(2000 年代早期的 Windows 桌面)上,int 恰好与 int* 大小相同,但您不得假设。

  1. scanfpointer 作为参数:最清晰的写法是scanf("%d", &amp;a[i][j]);

  2. 完成后别忘了free内存。

最后,每次看到这样建模的矩阵,我都会在内心深处死去。当然,它允许您使用[][] 表示法,但通常最好将其建模为一个连续的内存块并使用成语i * columns + j 来访问(i, j) 处的元素。

【讨论】:

  • 谢谢帮忙,你能给我一个使用成语 i * columns+j 的例子吗?
  • i * columns + j 自 1999 年以来不再需要。可以使用指向 VLA 的指针,从而获得方便的 [][] 语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多