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不会崩溃.为什么这样做?
仅仅因为你写入未分配的内存并不意味着程序会崩溃.没有像这样的运行时边界检查.
当您通过硬件检测到的通过操作系统分配的地址范围访问内存时,将发生段错误.在堆之前,您可能会获得大量内存访问权限.
写入太小的缓冲区是未定义的行为.没有保证它会崩溃.它可能不会崩溃.它似乎可行.它也可能会默默地破坏某些数据.它可能会导致程序无意中执行某些操作 - 当攻击者将未定义行为的影响转换为不需要的行为时,会出现许多安全漏洞.通过严格阅读标准,这甚至可能具有从你的鼻子召唤恶魔的效果.
在架构层面,通常分配被四舍五入到两个幂(但这无论如何都无法保证!),因此为什么你在这里看不到任何明显不好的东西.但不要依赖于此,因为它可以而且确实有所不同.