c - 在分配的内存范围之外写入时没有错误

标签 c pointers memory malloc

我的main.c内容:

int main(int argc, char **argv)  
{  
    void * tmp = malloc(8);  
    ((double *)tmp)[0] = 100;  
    ((double *)tmp)[1] = 102;  
    printf("tmp %p\n", tmp);  
    printf("tmp[0] %d %f %p\n", sizeof(((double *)tmp)[0]), ((double *)tmp)[0], &((double *)tmp)[0]);  
    printf("tmp[1] %d %f %p\n", sizeof(((double *)tmp)[1]), ((double *)tmp)[1], &((double *)tmp)[1]);  
    return EXIT_SUCCESS;  
}  
<小时/>
=========================OUTPUT=========================  
tmp 0xee8010  
tmp[0] 8 100.000000 0xee8010  
tmp[1] 8 102.000000 0xee8018  
========================================================

首先,我在变量 tmp 中分配了 8 个字节的内存,并将数字 100 分配给地址 0xee8010。

((double *)tmp)[0] = 100;  

我还将编号 102 分配给未分配的内存 0xee8018。

((double *)tmp)[1] = 102;  

但是我在构建时和运行时都没有看到任何错误消息。为什么不呢?

请帮我理解这一点。 谢谢。

最佳答案

写入未分配的内存或超出已分配内存的范围会导致 Undefined Behavior(UB) 这并不一定会导致崩溃。
未定义的行为意味着可以观察到任何行为,当 UB 发生时,编译器实现不需要执行任何特定操作(如您所期望的段错误)。

But I didn't see any error message at the build time and runtime.

如果代码不符合语言标准,则会出现编译时错误。在这种情况下,代码遵守语言标准,但执行的操作的结果未由语言标准定义。

关于c - 在分配的内存范围之外写入时没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382094/

相关文章:

c++ - 执行直接指针操作还是 [] 更好

c - 返回从函数分配的字符串文字的 const char * 是否安全?

c++ - 如何实现智能容器的拷贝构造函数?

c - Unix/C : put a file into shared memory

没有动态内存分配的 C++ 返回数组?

python - 将 Levenshtein 比率转换为 C++

c - fork 工作起来很奇怪

python - 使用嵌入在 c 中的 python 参数运行文件

c - 全局变量的意外性能

c++ - 以下数组从哪里获取内存?