c++:没有得到分段错误时,我应该

C++: not getting segfaults when I should be

本文关键字:错误 我应该 分段 c++      更新时间:2023-10-16

在注意到另一个项目中发生了一些奇怪的事情后,我写了下面的代码。即使数组被多次调用越界,这段代码也不会产生段错误。有人能向我解释一下为什么没有从运行下面的代码段故障?

#include <stdlib.h>
#include <stdio.h>
int main()
{
    int *a = (int *)malloc(4 * sizeof(int));
    int *b = (int *)malloc(3 * sizeof(int));
    int i = 0;
    for(i =0; i <3 ; i++)
    {   
     b[i] =  3+i;
    }   
    for(i = 0; i < 4; i++)
    {   
     a[i] = i;
    }   
    for(i = 0; i < 100 ; i++){
     a[i] = -1; 
    }   
    for(i = 0 ; i < 100 ; i++){
    printf("%d n", b[i]);
    }   
}

只有当您试图访问未映射到进程中的内存位置时,才会发生段错误。

malloc是从构成堆的更大的预分配内存块中获取的。例如,系统可能会在4K块中创建(或增加)堆,因此超出数组的边界仍然会在已经分配给进程的堆内存块内(并且它会为后续的mallocs分配内存)。

在另一种情况下(先前分配了更多内存,因此malloc接近堆块的末尾),这可能会出现段错误,但基本上不可能预测到这一点(特别是考虑到不同的平台或编译器)。

未定义行为未定义。任何事情都有可能发生,包括"正确"行为的出现。

当一个进程试图访问不属于该进程的操作系统帐户的内存时,会发生分段错误。由于操作系统内部的内存记帐是按页计算的(通常1页= 4 KB),因此进程可以访问分配的页内的任何内存,而操作系统不会注意到它。

  1. 应该使用new而不是malloc
  2. 平台是什么?
  3. 当你尝试未定义的行为-提示它是未定义的。