如何访问二维数组中结构体的属性

How to access the attributes of a struct in a 2D array

提问人:Hackerman 提问时间:9/18/2022 最后编辑:Hackerman 更新时间:9/18/2022 访问量:35

问:

我有一个简单的程序,可以制作结构体的 2d 数组。我想知道如何操作结构的属性。这是我的尝试;我不断出现分段错误,问题发生在 fillarr 方法中;

我的问题是,一旦数据进入 2D 数组,我不太明白如何操作数据。我知道数组是指针,我起初的假设是我可以做这样的事情

arr[h][w]->one = 'b';

我现在知道这显然是错误的,因为编译器真的不喜欢它。 现在,当我尝试时

arr[h][w].one = 'a'

编译器不会抱怨该语法,但这是触发我的分段错误的地方。

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

struct node {
  char one;
  char two; 
};

typedef struct node node; 

node** makeArr(int h, int w) {
  printf("Making arr\n"); 
  node** output = (node**)malloc(sizeof(node*) * h);

  for (int i = 0; i < h; i++) {
    output[i] = (node*)malloc(sizeof(node) * w); 
  }

  return output; 
}

void killarr(node **arr, int h, int w) {
  printf("Killing arr\n"); 
  for (int i = 0; i < h; i++) {
    free(arr[i]); 
  }
  free(arr);
}

void fillarr(node **arr, int h, int w) {
  printf("Filling arr\n"); 
  char x = 'a'; 
  for (int i = 0 ; i < h; i++) {
    for(int m = 0; m < w; m++){
      arr[h][w].one = x++; // <- here exactly
      
      arr[h][w].two = x++; // <- here too
   
    }
  }
}

int main(int argc, char *argv[]) {
  int h = 10;
  int w = 10; 
  node **arr = makeArr(h, w); 
  fillarr(arr, h, w); 

  killarr(arr, h, w); 
}
数组 C 指针 数据操作

评论

0赞 Chris 9/18/2022
鉴于您从不使用,有什么用?x++x
0赞 Hackerman 9/18/2022
@Chris我编辑了代码。它旨在更改分配给属性的字符
0赞 Chris 9/18/2022
我可能会建议将其简化为arr[h][w].one = x++;
0赞 Hackerman 9/18/2022
@Chris当然。但问题依然存在

答:

1赞 Chris 9/18/2022 #1

每次通过您正在访问的内循环 .但是,由于 和 是数组边界,因此您正在越界访问,从而导致未定义的行为。arr[h][w]hw

你的意思是:

arr[i][m].one = x++;      
arr[i][m].two = x++;

评论

0赞 Hackerman 9/18/2022
是的,这一定是我几周来犯过的最愚蠢的错误。
1赞 Chris 9/18/2022
嘿,在看到那个错误之前,我就发现了这个东西,这恰恰表明这是漫长的一天。x