【问题标题】:segmentation fault while accessing memory area [duplicate]访问内存区域时出现分段错误[重复]
【发布时间】:2012-09-04 08:59:44
【问题描述】:

可能重复:
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 内存管理的角度来解释这一点,那就太好了。

【问题讨论】:

    标签: c memory memory-management malloc


    【解决方案1】:

    您正在使用*(p+33*1000),*(p+34*1000) 访问超出为p 分配的内存,这是未定义的行为。您无法推理,因为它可能“起作用”或崩溃或任何事情都可能发生。

    【讨论】:

    • 我故意访问一个我没有分配的内存区域,我的问题是为什么它会给出 p + 34*1000 的分段错误而没有给出 p + 33*1000 的任何错误跨度>
    • 正如我之前所说,您无法推断出不符合 C 语言标准的未定义行为。将来,当您访问 p+33000 并且 似乎 为 p+33000 工作时,它可能会崩溃。
    【解决方案2】:

    您正在修改您自己未分配的内存 - 您正在写入的地址超出了数组的限制。每当您写入超出数组范围时,您都会面临段错误的风险 - 这取决于内存位置。取决于地址,它可能不会出现段错误,但这绝不是一件好事,结果将是不可预测的。

    【讨论】:

      【解决方案3】:

      这个程序表现出未定义的行为(根据 C 标准),严格来说,没有什么可以解释的。

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

      【讨论】:

        【解决方案4】:

        为 10 个整数分配空间后,您只能通过 *(p+0)*(p+1)、...、*p(p+8)*p(p+9) 取消引用这 10 个整数。不会再超出您分配的范围。

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

        【讨论】:

        • @PaulR 更正了我不正确的术语。
        【解决方案5】:

        可能是系统中的可用内存。 在这种情况下,所有 = 34 *1000 将失败。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-05
          • 2020-07-04
          • 2016-09-27
          • 2022-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多