我正在尝试使用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));
whereconn->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)
意味着它正在尝试读取它无法读取的内容