2013-10-28 84 views
1

我正在用c編寫一些東西,並在Ubuntu上用gcc進行編譯。我在Struct上定義了一個2維數組的雙指針「標記」(對於棋盤)。我必須用雙指針來定義它,我不能用矩陣或其他東西來做它。我用一個函數初始化它。它是正確的,但由於任何原因,我不能標記[0] [0]。如果我打印出來的價值,我得到一個非常大的和錯誤的價值。我用gdb調試它,發現在i = 4; k = 2時,mark [0] [0]的值出錯了,我也無法重寫值,如果我這樣做,我得到一個內存錯誤。有人可以幫我嗎?GCC Struct Doublepointer數組init

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

struct t_brett{ 
    //Boardsize 
    int n; 
    //Double Pointer for 2-dimensional Array 
     int **mark; 
    //number of jump 
    int lsgnr; 
    //position of the knight Springers 
    int x; 
    int y; 
}t_brett; 


int init_brett(struct t_brett *b, int n, int x, int y){ 
    b->n=n; 
    b->lsgnr=2; 
    b->x=x-1; b->y=y-1; 
    //first Dimension of Array 
    b->mark=malloc(sizeof(int)*n+1); 
    int i,k;  
    for(i=0;i<n;i++){ 
      //second Dimension of Array 
     b->mark[i]=malloc(sizeof(int)*n+1); 
     //Init Values: mit 0 
     for(k=0;k<n;k++){ 
       b->mark[i][k]=0; 
     } 
    } 
    b->mark[0][0]=0; 
    return 0; 
} 

Method for print: for lines with +----+----+ 
void gitter(struct t_brett *b){ 
    int i; 
    printf("+"); 
    for(i=0;i<b->n;i++){ 
      printf("---+"); 
    } 
    printf("\n"); 
} 

//Method for print: for lines with + 9+ 8+ 
void gitter_zahl(int j,struct t_brett *b){ 
    int i; 
    printf("+"); 
    for(i=0;i<b->n;i++){ 
      printf(" %2d+",b->mark[i][j]); 
    } 
    printf("\n"); 
} 

void print(struct t_brett *b){ 
    int i; int j=0; 
    //printf("+"); 
    for(i=0;i<b->n;i++){ 
      gitter(b); 
      gitter_zahl(j, b); 
      j++; 
    } 
    gitter(b); 
} 

int main(){ 
    struct t_brett b; 
    if (init_brett(&b,5, 5, 1)>0) return EXIT_FAILURE; 
    print(&b); 
} 

我的輸出:

+---+---+---+---+---+ 
+ 22216880+ 0+ 0+ 0+ 0+ 
+---+---+---+---+---+ 
+ 0+ 0+ 0+ 0+ 0+ 
+---+---+---+---+---+ 
+ 0+ 0+ 0+ 0+ 0+ 
+---+---+---+---+---+ 
+ 0+ 0+ 0+ 0+ 0+ 
+---+---+---+---+---+ 
+ 0+ 0+ 0+ 0+ 0+ 
+---+---+---+---+---+ 
+2

指針指針不是二維數組。你最好分配一個真正的二維數組並獲得一個指向其第一個元素的指針,像這樣:int(* arr)[y] = malloc(x * sizeof(* arr));'。除此之外,你爲什麼要分配一個額外的字節?這似乎沒有任何用途... – 2013-10-28 13:09:00

回答

0

在以下行中,你犯了一個錯誤

b->mark=malloc(sizeof(int)*n+1); 

應該

b->mark=malloc(sizeof(int*)*n+1); 

基本上你要存儲int中的int數組的地址第一個維度,對於每個架構都可能不同。所以你應該int *。

+0

非常感謝,這解決了我的問題。在mingw的窗戶上,另一條線路運行良好。隨你.... – user2928056

0

爲了節省大量的時間和調試,可以使用H2CO3在評論中說的真正的二維陣列,或者使用適當的getter和setter的一維數組。

struct t_brett { 
    //Boardsize 
    int boardSize; 
    // Pointer for a 2-dimensional Array 
    int *board; 
    //number of jump 
    int lsgnr; 
    //position of the knight Springers 
    int x; 
    int y; 
} t_brett; 

// somewhere in initialization code 
board = calloc (sizeof(int) * boardSize * boardSize); 

int getValue(t_brett* brett, int x, int y) { 
    if (x<0 || x>=boardSize) return -1; 
    if (y<0 || y>=boardSize) return -1; 
    return brett->board[x+y*boardSize]; 
}