gpt4 book ai didi

c - C中动态大小的数组

转载 作者:行者123 更新时间:2023-12-01 12:52:59 26 4
gpt4 key购买 nike

我正在尝试使用 http://c.learncodethehardway.org/ 学习 C但我在第 18 章 (http://c.learncodethehardway.org/book/learn-c-the-hard-waych18.html) 中遇到了一个额外的学分问题,我希望有人能帮助我。

我遇到的具体问题是有几个这样定义的结构:

#define MAX_ROWS = 500;
#define MAX_DATA = 512;

struct Address {
int id;
int set;
char name[MAX_DATA];
char email[MAX_DATA];
};

struct Database {
struct Address rows[MAX_ROWS];
};

struct Connection {
FILE *file;
struct Database *db;
};

挑战在于返工,以便 rows 可以具有不依赖于该常量的可变大小。

所以在我的 Database_create 方法中,我尝试使用以下内容初始化 rows:

conn->db->rows = (struct Address*) malloc(max_rows * sizeof(struct Address));

其中 conn->db 指向 Database 的一个实例,max_rows 是一个传递给函数的 int。我还将数据库结构更改为

struct Database{
struct Address* rows;
}

那段代码似乎运行正常,但如果我尝试访问 rows 的任何成员,我会得到一个段错误,我认为这意味着我正在尝试访问不正确的内存位在使用中。

我已经在这上面花了好几个小时,我确信我不会离得太远,但我非常感谢任何指导,让我走上正轨。


编辑:只是想在用 Valgrind 运行它之后添加更多细节,这会引发错误:

==11972== Invalid read of size 4
==11972== at 0x100001578: Database_set (ex18.c:107)
==11972== by 0x100001A2F: main (ex18.c:175)
==11972== Address 0x7febac00140c is not stack'd, malloc'd or (recently) free'd

它指向的代码行是:

struct Address *addr = &conn->db->rows[id];
if(addr->set) die("Already set, delete it first");

第 107 行是 if(addr->set),我认为这意味着它正在尝试读取它无法读取的内容

最佳答案

你想要 sizeof(struct Address) 而不是 sizeof(struct Address*)

sizeof(struct Address*) 可能返回大小为 4(不过完全取决于目标平台),而 Address 结构的实际大小更接近到 1040(假设每个字符 1 个字节,每个整数 4 个字节)

关于c - C中动态大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11156719/

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