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

问题描述

我用malloc分配了1个字节,但是我可以在该数组中放置超过1个整数,该ptr指向数组的第一个元素。这怎么可能?

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

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

输出:5 12

解决方法

C是一种低级语言,可信任您以确保所编写的代码安全。与其他高级语言不同,运行时或编译时都没有检查。

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

ptr[0] = 5

相当于写作

*ptr = 5

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

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

类似地写

ptr[10] = 5

相当于写作

*(ptr+10) = 5

在这种情况下,这是未定义的行为,允许编译器和运行时执行任何操作,包括产生您想要的结果!

关于这是如何工作的,分配整数的堆很可能包含超出分配空间的足够空间,您可以写入该空间而不会导致访问冲突。

在真实程序中,空间可能会被完全闲置,因此(在某些时候)不会出现明显的不良影响,或者程序中的其他代码或运行时可能会使用它来跟踪堆中的分配。 / p>

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

,

我用malloc分配了1个字节

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

但是我可以在这个数组中放置超过1个整数

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

这被称为未定义行为。

取消引用尚未明确初始化的指针

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

https://stackoverflow.com/a/367662/4975822