我正在使用c编程并在ubuntu上使用gcc编译它。我在Struct上为一个二维数组(对于棋盘)定义了一个双指针“mark”。我必须用双指针定义它,我不允许用矩阵或其他东西来做它。我用一个函数初始化它。它是正确的,但由于任何原因,我不能解决标记[0] [0]。如果我打印出价值,我会得到一个非常大而错的价值。我用gdb调试它,发现在i = 4; k = 2时,mark [0] [0]的值出错,我也无法重写该值,如果我这样做,我会收到内存错误。有人可以帮助我吗?
#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+
+---+---+---+---+---+
答案 0 :(得分:0)
在以下行中,您犯了一个错误
b->mark=malloc(sizeof(int)*n+1);
应该是
b->mark=malloc(sizeof(int*)*n+1);
基本上,您将在第一维中存储int数组的地址,对于每个体系结构可能会有所不同。所以你应该int *。
答案 1 :(得分: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];
}