嗯,我一直认为如果我调用 malloc 函数,我会分配特定数量的内存,但是,我刚刚意识到如果我写:
int* a = (int*)malloc(sizeof(int) * 2);
我可以为 a[4]
或任何其他索引分配一个值,但在这种情况下,我只能分配给 a[0]
或a[1]
。我有什么概念错误?
最佳答案
当你写a[4]
时,它和写*(a + 4)
是一样的。由于编译器不知道在 a
指向的地址分配了多少内存,它会很乐意让你寻址内存。
但是,位于此处的内存可以是任何东西 - 它可以是您的程序使用的另一个变量、堆栈的一部分,或者只是在您的程序范围之外。以这种方式在分配的空间之外访问可能(充其量)产生段错误或(最坏)通过覆盖程序的其他部分而引入安全漏洞。
您是正确的,因为您只能a[0]
或 a[1]
安全地,但 C 编译器会让你在那个边界之外分配(因为它不知道有什么不同)。
在您的示例中执行 a[4]
是不安全的。
关于c - 访问C中的外部分配空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628602/