我正在阅读有关缓冲区溢出的信息。我发现关于堆栈上局部变量的内存分配的一件奇怪的事情
int f1 ()
{
char string1[12];
char string2[4];
}
这里分配发生在堆栈上。
现在,在GCC string2 中分配了 4 个字节,但如果我声明的不是 2 的幂(最多 16 个),那么编译器会为其分配 16 个字节。这意味着如果我在 3,5,6,7,....,15 个字节中分配 string2,那么编译器会为其分配 16 个字节,但如果我分配 2 的幂,例如 1,2,4,8...然后它被分配完全相同的大小。如果我分配超过 16 个字节(不是 2 的幂),那么它分配 32 个字节(我猜最多 32 个字节)。
而在 Visual Studio 中,如果我分配 1 个字节,则分配 9 个字节,如果从 2-4 个字节分配,则分配 12 个字节,如果从 5-8 个字节分配,则由编译器分配 16 个字节。
有谁知道为什么会有这样的任务???
至少在 Visual Studio 中,如果存在缓冲区溢出,我会收到调试错误,但在 gcc 中没有任何反应。GCC 仅在发生太大溢出时才提供分段错误。