我的代码怎么可能超过我用 malloc 分配的大小而不给出错误

How is it possible that my code exceeds the size of i allocated with malloc and not give error

我用 malloc 分配了 1 个字节,但我可以在这个数组中放置超过 1 个整数,其中 ptr 指向数组的第一个 element.How 这可能吗?

    int main(){
    int *ptr = (int*)malloc(sizeof(int));
    ptr[1] = 5;
    ptr[10] = 12;

    printf("%d %d\n",ptr[1], ptr[10]);
    }

输出:5 12

I allocate 1 byte with malloc

您没有分配 1 个字节。你分配 1 int.

but i can put even more than 1 integer in this array

ptr[1] = 5;  
ptr[10] = 12;

这叫做未定义的行为。

Dereferencing a pointer that has not yet been definitely initialized

您可以查看此答案,其中列出了 C++ 中最常见的未定义行为,其中一些(包括您的情况)也适用于 C。

C 是一种 low-level 语言,它信任您以确保您编写的代码是安全的。与其他 higher-level 语言不同,在 运行 时间或编译时间没有检查。

请记住,在这种情况下,您已经为一个整数分配了内存(这可能是四个字节而不是 1 个字节。)Malloc 返回一个指针,该指针不包含有关大小的任何信息您分配的区块。

ptr[0] = 5

相当于写

*ptr = 5

请注意,在 C 中,数组的第一个元素是 0 而不是 1。

没有检查 ptr 是否指向有效的内存块。

写的时候也一样

ptr[10] = 5

相当于写作

*(ptr+10) = 5

在此上下文中这是未定义的行为,编译器和 运行time 可以做任何事情,包括产生您想要的结果!

至于这是如何工作的,很可能从中分配整数的堆包含足够的 space 超过分配的 space,您可以写入而不会导致访问冲突。

在真实程序中,space 可能完全未使用,因此没有明显的不良影响(有时),或者它可能被程序中的其他代码或 运行是时候跟踪堆中的分配了。

缺少 运行 时间检查使 C 非常强大和高效,但也使得编写不稳定或不安全的代码变得容易。