我正在以艰难的方式学习 C 的练习 17,这需要构建一个数据库并将其存储在一个文件中。我已经按预期初始化了一个数据库,但是当我增加行数(特别是超过阈值100) 在数据库中,它返回 异常:在 rip=0010040132C 处的 STATUS_ACCESS_VIOLATION。
我使用 GDB 搜索错误,这是结果。
Thread 1 "ex17" received signal SIGSEGV, Segmentation fault. 0x000000010040132c in Database_create (conn=0x600049490, max_data=12, >max_rows=200) at ex17_1.c:87 87 (conn->db->rows +isizeof(struct Address)) =addr;
这是我用过的代码。
struct Address{
int id;
int set;
char *name;
char *email;
};
struct Database{
int MAX_ROWS;
int MAX_DATA;
struct Address *rows;
};
struct Connection{
FILE *file;
struct Database *db;
};
void Database_create(struct Connection *conn,int max_data,int max_rows){
conn->db->MAX_DATA =max_data;
conn->db->MAX_ROWS = max_rows;
conn->db->rows =malloc(max_rows*sizeof(struct Address));
for(int i=0;i<max_rows;i++){
struct Address addr = {.id =i,.set = 0};
*(conn->db->rows +i*sizeof(struct Address)) =addr;
}
我做了一些研究,我认为 STATUS_ACCESS_VIOLATION 发生在 您访问了您不应该访问的一部分内存。但是我还没有在我的代码中看到错误。 有人可以检查这里可能的原因是什么吗?
最佳答案
错误在这一行
+i*sizeof(struct Address)
当添加到指针时,编译器已经乘以大小,所以不要再这样做了。你只要
+i
关于c - STATUS_ACCESS_VIOLATION 取决于数据的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55691287/