2016-12-05 103 views
1

我试着在C中创建一个矩阵,并有一些输入值,但我不知道它为什么会抛出“分段错误”。这是我的代码:在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; 
} 
+1

它应该是'的scanf( “%d”,&(A [i] [j]));' – MayurK

+1

如果你用gcc编译,它警告你你使用的是scanf错误,解决gcc警告通常可以解决很多问题。 –

回答

0
  1. 您的a分配应该是

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

注以及在sizof指针类型。在某些系统(2000年初的Windows桌面)上,int恰好与int*大小相同,但是您的肯定不是

  • scanf需要指针作为参数:写这个最清晰的方式是scanf("%d", &a[i][j]);

  • 一旦你都不要忘记free内存完成。

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

    +0

    感谢您的帮助,您能否给我一个使用成语i *列+ j的例子? – fenigo69

    +0

    请参见http://stackoverflow.com/questions/17259877/1d-or-2d-array-whats-faster – Bathsheba

    +0

    自1999年以来,我不需要“i *列+ j”。可以使用指向VLA的指针,从而得到方便的[] []'语法。 – Lundin

    2

    给出的答案被@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; 
    } 
    
    +0

    Upvoted。这是“王牌”答案,但我没有足够的信心来使用它,特别是当你不得不考虑衰减指针时。 – Bathsheba

    +0

    @Bathsheba数组指针不会衰减。当把这个数组指针传递给一个函数时,你只需要声明这个函数为'void func(size_t x,size_t y,int array [x] [y])''。其中'int array [x] [y]'将被编译器(“decay”)调整为指向第一个元素的指针:int(* array)[y]'。这正是我们在调用者中所拥有的。 – Lundin

    +0

    这很有帮助。事实上,这大部分都高于我的薪酬等级。请随时从我的答案中挑选一些方面,并将其纳入本文。 – Bathsheba