我正在艰苦地学习Learn C的练习17中,这需要构建数据库并将其存储在FILE中。我已经按预期初始化了数据库,但是当我增加行数时(尤其是超过阈值时) 100)在数据库中,则返回 例外:STATUS_ACCESS_VIOLATION位于rip = 001040132C。
我用GDB搜索错误,这是结果。
线程1“ ex17”收到信号SIGSEGV,分段错误。 在ex17_1.c:87中Database_create中的0x000000010040132c(conn = 0x600049490,max_data = 12,> max_rows = 200) 87 (conn-> db->行+ i sizeof(结构地址))= 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发生在 您访问了您不应该访问的部分内存。但是我还没有看到代码中的错误。 有人可以在这里检查可能的原因吗?
答案 0 :(得分:3)
错误在此行
+i*sizeof(struct Address)
当添加到指针时,编译器已经乘以大小,因此不再执行。你只想要
+i