【问题标题】:GCC Struct Doublepointer array initGCC 结构双指针数组初始化
【发布时间】:2013-10-28 13:05:27
【问题描述】:

我正在用 c 编程并在 ubuntu 上用 gcc 编译它。我在 Struct 上为二维数组(用于棋盘)定义了一个双指针“标记”。我必须用双指针定义它,并且不允许用矩阵或其他东西来定义它。我用一个函数初始化它。它是正确的,但由于任何原因我无法解决标记 [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+
+---+---+---+---+---+

【问题讨论】:

  • 指针指向指针不是二维数组。您最好分配一个真正的二维数组并获得指向其第一个元素的指针,如下所示:int (*arr)[y] = malloc(x * sizeof(*arr));。除此之外,你为什么要分配一个额外的字节?它似乎没有任何作用......

标签: c arrays gcc struct


【解决方案1】:

在下面一行中,你犯了一个错误

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

应该是

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

基本上,您要将 int 数组的地址存储在第一维中,这对于每个体系结构都可能不同。所以你应该 int*。

【讨论】:

  • 非常感谢,这解决了我的问题。在带有 mingw 的 Windows 上,另一条线运行良好。随便……
【解决方案2】:

为了节省大量时间和调试,要么使用真正的二维数组,如评论中所说的 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];
}

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多