为什么运行它不会发出分段错误?

Ale*_*lds 4 c memory malloc gcc

可能重复:
无效的读/写有时会产生分段错误,有时则不会

我有以下代码:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int *ptr = NULL;
    ptr = malloc(sizeof(char));
    if (ptr) {
        *ptr = 10;
        printf("sizeof(int): %zu\nsizeof(char): %zu\n", sizeof(int), sizeof(char));
        printf("deref of ptr: %d\n", *ptr);
        free(ptr);
        return EXIT_SUCCESS;
    }
    else
        return EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行它时,我得到以下输出:

$ gcc test.c
$ ./a.out 
sizeof(int): 4
sizeof(char): 1
deref of ptr: 10
Run Code Online (Sandbox Code Playgroud)

该值sizeof(char)小于sizeof(int).我的malloc电话只留出足够的空间char.然而,我的程序能够分配一个整数值而ptr不会崩溃.为什么这样做?

Fra*_* IV 8

仅仅因为你写入未分配的内存并不意味着程序会崩溃.没有像这样的运行时边界检查.

当您通过硬件检测到的通过操作系统分配的地址范围访问内存时,将发生段错误.在堆之前,您可能会获得大量内存访问权限.


bdo*_*lan 6

写入太小的缓冲区是未定义的行为.没有保证它会崩溃.它可能不会崩溃.它似乎可行.它也可能会默默地破坏某些数据.它可能会导致程序无意中执行某些操作 - 当攻击者将未定义行为的影响转换为不需要的行为时,会出现许多安全漏洞.通过严格阅读标准,这甚至可能具有从你的鼻子召唤恶魔的效果.

在架构层面,通常分配被四舍五入到两个幂(但这无论如何都无法保证!),因此为什么你在这里看不到任何明显不好的东西.但不要依赖于此,因为它可以而且确实有所不同.