超出分配内存的指针访问不会导致段错误

时间:2016-03-05 09:57:59

标签: c segmentation-fault pointer-arithmetic

我在教自己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)

1 个答案:

答案 0 :(得分:1)

当程序启动时,OS会将程序存储器分为可读(代码段)和可写(数据段以及堆)。现在它将取决于您要解除引用的指针中存储的地址。如果它指向有效的可写存储器,则不会引发分段错误异常,否则将引发分段错误异常。