gpt4 book ai didi

带有指向数组指针的 C 结构

转载 作者:太空狗 更新时间:2023-10-29 16:13:24 27 4
gpt4 key购买 nike

我有以下代码,我对为什么会出现段错误感到有点困惑。

typedef struct {
int tag;
int valid;
} Row;

typedef struct {
int index;
int num_rows;
Row **rows;
} Set;

/* STRUCT CONSTRUCTORS */

// Returns a pointer to a new Sow.
// all fields of this row are NULL
Row* new_row() {
Row* r = malloc(sizeof(Row));
return r;
}

// Returns a pointer to a new Set.
// the set's index is the given index, and it has an array of
// rows of the given length.
Set* new_set( int index, int num_rows, int block_size ) {
Set* s = malloc(sizeof(Set));
s->index = index;
s->num_rows = num_rows;

Row* rows[num_rows];
for (int i = 0; i < num_rows; i++) {
Row* row_p = new_row();
rows[i] = row_p;
}
s->rows = rows;

return s;
}

/* PRINTING */

void print_row( Row* row ) {
printf("<<T: %d, V: %d>>", row->tag, row->valid);
}

void print_set( Set* set ) {
printf("[ INDEX %d :", set->index);


for (int i = 0; i < set->num_rows; i++) {
Row* row_p = set->rows[i];
print_row(row_p);
}

printf(" ]\n");
}


int main(int argc, char const *argv[]) {

Set* s = new_set(1, 4, 8);
print_set(s);


return 0;

}

基本上 Set 有一个指向 Row 数组的指针。我认为 Row* row_p = set->rows[i]; 是从集合中获取行的正确方法,但我一定遗漏了一些东西。

最佳答案

您正在分配 Row* 的本地数组

  Row* rows[num_rows];
for (int i = 0; i < num_rows; i++) {
Row* row_p = new_row();
rows[i] = row_p;
}
s->rows = rows;

并让 Setrows 指针指向它。函数返回后本地数组不再存在,因此 s->rows 是一个悬空指针。在函数返回后仍然有效的内存必须使用 malloc(或其同类之一)分配。

关于带有指向数组指针的 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com