2016-12-05 101 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