C 为什么此程序中不显示SEGFULT?

C 为什么此程序中不显示SEGFULT?,c,memory-leaks,segmentation-fault,C,Memory Leaks,Segmentation Fault,据我所知,当程序试图访问不可用的内存而崩溃时,就会出现分段错误。我知道第一个程序a.c是错误的,因为sizeofa是4bytes*5=20bytes。第二个程序B.c是错误的,因为无限循环。当我运行A.out时,我没有得到错误,只是得到了不正确的结果。结果也不一致。但当我用完B时,我就犯了分段错误 我希望A和B有一个相同的分段错误,因为它们都访问超出范围的内存数据;原因是。有人能告诉我为什么吗 交流 澄清一下:分段错误并不是因为经常检查代码是否做了超出范围的事情而出现的。相反,它是一种CPU级别

据我所知,当程序试图访问不可用的内存而崩溃时,就会出现分段错误。我知道第一个程序a.c是错误的,因为sizeofa是4bytes*5=20bytes。第二个程序B.c是错误的,因为无限循环。当我运行A.out时,我没有得到错误,只是得到了不正确的结果。结果也不一致。但当我用完B时,我就犯了分段错误

我希望A和B有一个相同的分段错误,因为它们都访问超出范围的内存数据;原因是。有人能告诉我为什么吗

交流


澄清一下:分段错误并不是因为经常检查代码是否做了超出范围的事情而出现的。相反,它是一种CPU级别的机制,涉及告诉CPU某些事情应该发生在RAM的哪个区域,并捕获违反此规则的情况。RAM的这个区域也不完全是代码或数据的大小。因此,在某些情况下,访问超出范围的日期是指访问CPU可能访问的内存,例如,在您使用过高的索引访问的变量或数组之后存储的另一个变量或数组,甚至是一些未使用的内存,因为允许的内存块可能具有向上舍入的大小以匹配某些对齐边界

我不认为int a[5]={1,2,3,4,5};使您的应用程序不会失败。如果省略={1,2,3,4,5}您仍然定义了要访问的有效内存块,那么它的内容就是没有定义


您是否希望由于使用sizeofa而不是sizeofa/sizeofint而导致失败?假设int是4个字节,这将导致A访问的内存是允许的4倍。这一切很可能仍在堆栈内存中,在那里不会导致分段错误。在B中,有一个无限循环,它导致它的地址超出堆栈大小,这将导致分段错误。

澄清一下:分段错误不是由于某些不断检查代码是否超出范围而出现的。相反,它是一种CPU级别的机制,涉及告诉CPU某些事情应该发生在RAM的哪个区域,并捕获违反此规则的情况。RAM的这个区域也不完全是代码或数据的大小。因此,在某些情况下,访问超出范围的日期是指访问CPU可能访问的内存,例如,在您使用过高的索引访问的变量或数组之后存储的另一个变量或数组,甚至是一些未使用的内存,因为允许的内存块可能具有向上舍入的大小以匹配某些对齐边界

我不认为int a[5]={1,2,3,4,5};使您的应用程序不会失败。如果省略={1,2,3,4,5}您仍然定义了要访问的有效内存块,那么它的内容就是没有定义


您是否希望由于使用sizeofa而不是sizeofa/sizeofint而导致失败?假设int是4个字节,这将导致A访问的内存是允许的4倍。这一切很可能仍在堆栈内存中,在那里不会导致分段错误。在B中,有一个无限循环,导致它的地址超出堆栈大小,这将导致分段错误。

这两种行为都是未定义的行为。UB表示从C的角度来看,无法确定操作的结果

对未分配内存的访问可能但不一定会导致SEG故障

但是试着理解这两个片段

a。您可以访问距离数组边界不远的内存。操作系统不会阻止程序访问此区域。什么也没发生


b。最终,您将到达受操作系统保护的内存。segfault发生。

两者都是未定义的行为。UB表示从C的角度来看,无法确定操作的结果

对未分配内存的访问可能但不一定会导致SEG故障

但是试着理解这两个片段

a。您可以访问距离数组边界不远的内存。操作系统不会阻止程序访问此区域。什么也没发生


b。最终,您将到达受操作系统保护的内存。segfault发生。

B中的无限循环。但操作系统会在segmintaion错误中捕获您。没错。但我想知道为什么A不会产生分割错误。请看我的答案。现在还不能保证操作系统会帮你找到bug。如果幸运的话,你会很早就撞车。如果不走运的话,当你发货的时候你会崩溃。B中的无限循环。但是操作系统发现你有segmintaion错误。没错。但我想知道为什么A不会产生分割错误。请看我的答案。现在还不能保证操作系统会帮你找到bug。如果幸运的话,你会很早就撞车。如果运气不好,那么在您发货时会发生崩溃。
int main() {
    int a[5] = {1, 2, 3, 4, 5};
    unsigned total = 0;
    printf("size of a is %lu\n", sizeof(a));
    printf("total was %d\n", total);
    for (int j = 0; j < sizeof(a); j++) {
        total += a[j];
    }
    printf("sum of array is %d\n", total);
}
int main() {
    int a[20];
    for (int i = 0; ; i++) {
        a[i] = i;
    }
}