在 C/C++ 中,没有通用的解决方案。你不能在编译时这样做,因为在 C 中有太多改变内存的方法。示例:
char * ptr = &array2;
ptr = foo(ptr); // ptr --;
ptr 现在包含一个有效地址,但该地址在array2 之外。这可能是一个错误或您想要的。 C 无法知道(在 C 中没有办法说“我想要它”),所以编译器无法检查它。傻傻的:
char * array2 = malloc(100);
C 编译器如何知道您将内存视为 char 数组并在您编写 &array2[100] 时希望收到警告?
因此,大多数解决方案都使用“mungwalls”,即当您调用 malloc() 时,它们实际上会分配比您要求的多 16/32 字节:
malloc(size) {
mungwall_size = 16;
ptr = real_malloc(size + mungwall_size*2);
createMungwall(ptr, mungwall_size);
createMungwall(ptr+size, mungwall_size);
return ptr+size;
}
在free() 中,它将检查分配的内存区域之前和之后的 16 个字节是否未被触及(即 mungwall 模式仍然完好无损)。虽然并不完美,但它会使您的程序更早崩溃(并希望更接近错误)。
您也可以使用特殊的 CPU 命令来检查所有内存访问,但这种方法会使您的程序比现在慢 100 到 100 万倍。
因此,C 之后的语言不允许使用指针,这意味着“数组”是具有大小的基本类型。现在,您可以通过简单的比较来检查每个数组访问。
如果你想用 C 语言编写保存的代码,你必须模仿它。创建一个数组类型,永远不要使用指针或char * 作为字符串。这意味着您必须始终转换您的数据类型(因为所有库函数都使用const char * 表示字符串)但它使您的代码更安全。
语言确实会老化。 C 现在已经 40 岁了,我们的知识也在不断发展。它仍然在很多地方使用,但它不再是首选。这同样适用于(在较小的范围内)C++,因为它具有 C 的相同基本缺陷(即使您现在拥有可以解决其中许多问题的库和框架)。