如何解决我的代码怎么可能超过我分配给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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。