超出分配内存的指针访问不会导致段错误
Pointer access beyond allocated memory does'nt cause segfault
我正在自学 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)
程序启动时,OS会将程序内存分为可读(代码段)和可写(数据段以及堆)。现在它将取决于存储在您取消引用的指针中的地址。如果它指向有效的可写内存,则不会引发分段错误异常,否则会引发分段错误异常。
我正在自学 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)
程序启动时,OS会将程序内存分为可读(代码段)和可写(数据段以及堆)。现在它将取决于存储在您取消引用的指针中的地址。如果它指向有效的可写内存,则不会引发分段错误异常,否则会引发分段错误异常。