帮助我理解C中这个简单的malloc

时间:2010-12-19 22:56:25

标签: c pointers malloc

以下是我想了解的代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

int main()
{

    int *ptr = (int *)malloc(5 * sizeof(int)),i;

    for(i=0;i<MAX;i++)
    {
        ptr[i] = i;
    }

    for(i=0;i<MAX;i++)
    {
        printf("%d\n",ptr[i]);
    }

    return 0;
}

我的问题:我分配了5 * int大小的内存,但为什么需要超过5个ineteger? 日Thnx

5 个答案:

答案 0 :(得分:4)

您为5个整数保留了空间。对于其他95个整数,您正在写入为其他目的保留的空间。您的程序可能会崩溃,也可能不会崩溃,但您应该预期它会以某种方式失败。

答案 1 :(得分:2)

它不“超过”5个整数;你只是调用未定义的行为。即使您看到代码在您的实现上有效,您也不能指望代码“成功”。

答案 2 :(得分:2)

它不是'取'超过5个整数:你分配了5 * sizeof(int)并通过访问超过这个大小的内存来调用未定义的行为。

毫无疑问,您是否应该将MAX设置为10,1024或100000:代码基本上是错误的,并且在运行它时它没有失败这一事实并没有减少错误。像valgrind这样的工具可以帮助您发现此类错误。

答案 3 :(得分:1)

  • 您正在分配5个整数,任何您编写或阅读的内容都不正确
  • 操作系统保护边界为1页,通常为4k。
  • 即使您只分配了5个整数,您仍然可以保护页面的其余部分不受保护。这就是缓冲区溢出和许多程序错误行为的发生方式

  • 我打赌如果你的MAX设置为1025,你会有段错误(假设这是你的程序)

答案 4 :(得分:1)

C不对数组执行边界检查。如果你有一个5元素数组,C很乐意让你分配给arr[5]arr[100],甚至是arr[-1]

如果你很幸运,这只会覆盖未使用的内存,无论如何你的程序都会正常工作。

如果你运气不好,你将覆盖程序中的其他变量,malloc的元数据或操作系统,以及坏事将会发生。习惯于看到短语“分段错误”。