访问内存区域时出现分段错误

时间:2012-09-04 08:59:44

标签: c memory memory-management malloc

  

可能重复:
  Invalid read/write sometimes creates segmentation fault and sometimes does not

我正在对malloc进行一些实验,并在linux m / c上编写了这个非常小的程序:

int main(){
    int *p=NULL;
    p = (int *)malloc(10);
    *(p + 33*1000) = 5;
    free(p);
    return 0;
   }

此程序不会给出分段错误,但如果我将第5行更改为此  *(p + 34 * 1000)= 5;  然后它给出了分段错误。在我的系统上,页面大小为4K。

我无法解释为什么在p之后它会在大约128Kb(34 * 1000大约是128K)时发出分段错误。

如果有人能够从linux中的内存管理角度解释这一点,那就太棒了。

5 个答案:

答案 0 :(得分:4)

您使用p*(p+33*1000) 未定义的行为来访问您为*(p+34*1000)分配的内存之外的内容。你无法推理,因为它可能“工作”或崩溃或任何事情都可能发生。

答案 1 :(得分:2)

您正在修改自己未分配的内存 - 您要写入的地址超出了数组的限制。每当你超出数组边界进行编写时,都会遇到段错误的风险 - 这取决于内存位置。根据地址的不同,它可能不会出现段错误,但这并不是一件好事,结果将无法预测。

答案 2 :(得分:2)

该程序显示未定义的行为(根据C标准),严格来说,没有其他任何可以解释的内容。

语言标准不以任何方式描述在任何特定平台上如何或应该在低级别实现内存管理。尽管您没有明确地分配它们,但仍可以访问某些内存区域。

答案 3 :(得分:0)

为10个整数分配空格后,您只能按*(p+0)*(p+1),...,*p(p+8)*p(p+9)取消引用这10个整数。没有别的你超出了你所分配的范围。

在其他地方取消引用可能意味着您正在尝试使用无效指针,从而导致分段错误。

答案 4 :(得分:0)

可能是系统中的可用内存。 在这种情况下,所有< = 33 * 1000将通过并且所有> = 34 * 1000将失败。