我在教自己C, 我不明白为什么以下代码不会因分段错误而中断。
printf("loading \n");
conn->db = malloc(sizeof(struct Database));
int rc = fread(&conn->db->max_rows,sizeof(int) , 1, conn->file);
rc = fread(&conn->db->max_data,sizeof(int) , 1, conn->file);
conn->db->rows = malloc(Get_address_size(conn) * conn->db->max_rows);
printf("address size is : %d\n", Get_address_size(conn));
int i;
struct Address * r = conn->db->rows;
for (i = 0; i < conn->db->max_rows; i++)
{
rc = fread(&r->id, sizeof(int) , 1, conn->file);
rc = fread(&r->set, sizeof(int) , 1, conn->file);
r->name = malloc(conn->db->max_data);
r->email = malloc(conn->db->max_data);
rc = fread(r->name, conn->db->max_data , 1, conn->file);
rc = fread(r->email, conn->db->max_data , 1, conn->file);
r = r++;
}
r=r+100;
printf(here I'm trying to break my code %d\n",r->id);
if (rc != 1) die("Failed to load database.");
Get_address_size函数只是
的包装 sizeof(struct Address)
答案 0 :(得分:1)
当程序启动时,OS会将程序存储器分为可读(代码段)和可写(数据段以及堆)。现在它将取决于您要解除引用的指针中存储的地址。如果它指向有效的可写存储器,则不会引发分段错误异常,否则将引发分段错误异常。