c - STATUS_ACCESS_VIOLATION 取决于数据的大小

标签 c

我正在以艰难的方式学习 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/

相关文章:

c - 尝试创建动态数组,给出意想不到的结果

c - C 中仅使用位运算符的符号函数

c++ - C - 通过引用传递数组 - 仅第一个元素集

c - 编译HTK时出现“严重错误:bits/libc-header-start.h:无此类文件或目录”

c - 使用 Cairo 图形绘制多个矩形

c - 使用链表与大数组进行搜索

c - getchar() 不等待按下 Enter 键

c - 为什么不评估预增量

c++ - 隔离C库类(C++代码)

c - 如何正确处理一个巨大的字符串?