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