Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帮助我理解C中的这个简单malloc_C_Pointers_Malloc - Fatal编程技术网

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

帮助我理解C中的这个简单malloc,c,pointers,malloc,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(

下面是我想理解的代码:

#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;
}
#包括
#包括
#定义最大值100
int main()
{
int*ptr=(int*)malloc(5*sizeof(int)),i;

对于(i=0;i它不会“占用”超过5个整数;您只是在调用未定义的行为。即使看到代码在您的实现中工作,您也不能期望代码“成功”。

它不会“占用”超过5个整数;您只是在调用未定义的行为。您不能期望代码“成功”即使您看到它在您的实现中工作。

它不会“占用”超过5个整数:您分配了
5*sizeof(int)
,并通过访问超出此大小的内存来调用未定义的行为


毫无疑问,您是否应该将
MAX
设置为10、1024或100000:代码从根本上来说是错误的,并且当您运行它时它没有失败这一事实并不能减少错误。类似的工具可以帮助您检测此类错误。

它不会“占用”超过5个整数:您分配了
5*sizeof(int)
并通过访问超出此大小的内存来调用未定义的行为


毫无疑问,您是否应该将
MAX
设置为10、1024或100000:代码从根本上来说是错误的,并且当您运行它时它没有失败这一事实并不能减少错误。类似的工具可以帮助您检测此类错误。

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

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

  • 您分配的是5个整数,任何您写入或读取的超过此值的内容都是不正确的
  • 操作系统保护边界为1页,通常意味着4k
  • 即使只分配了5个整数,页面的其余部分仍然没有受到保护。这就是缓冲区溢出和许多程序错误行为的原因

  • 我打赌如果你的最大值设置为1025,你将有seg故障(假设这是你的程序)

      • 您分配的是5个整数,任何您写入或读取的超过此值的内容都是不正确的
      • 操作系统保护边界为1页,通常意味着4k
      • 即使只分配了5个整数,页面的其余部分仍然没有受到保护。这就是缓冲区溢出和许多程序错误行为的原因

      • 我打赌如果你的最大值设置为1025,你将有seg故障(假设这是你的程序)


      C不会对数组执行边界检查。如果您有一个5元素数组,C会很高兴地让您分配给
      arr[5]
      arr[100]
      ,甚至
      arr[-1]

      如果幸运的话,这只会覆盖未使用的内存,您的程序无论如何都会工作


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

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

      如果幸运的话,这只会覆盖未使用的内存,您的程序无论如何都会工作


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

      OS保护边界与此无关。malloc不要求返回与页面对齐的块。它很可能返回与其他块共享页面的块,和/或跨越页面边界。Dan,我不是说这是一项要求。但如果这是在页面边界的开头,那将是实际上,在上面的应用程序中,我可以合理地说这是堆中唯一的东西,因此从页面边界开始。操作系统页面不太可能直接影响哪些内存块是由
      malloc
      分配的。如果你简单地说malloc返回了一个块,那么更可能是正确的从其他未使用的内存块。OS保护边界与此无关。不要求malloc返回与页面对齐的块。它很可能返回与其他块共享页面的块,和/或跨页面边界的块。Dan,我不是说这是一项要求。但如果这是在开始时对于页面边界,这将是人们能够获得的最大回旋余地。事实上,在上面的应用程序中,我可以合理地说这是堆中唯一的东西,因此从页面边界开始。操作系统页面不太可能直接影响
      malloc
      分配的内存块。如果你mply假设malloc从一块未使用的内存中返回了一个块。您正在使用为其他目的保留的空间。该内存可能会被您在程序生命周期中调用的任何东西写入,也可能不会被写入。如果没有其他东西使用该内存,那么您将收回您放入其中的内容。但您不应该认为这是一个错误格拉姆正在“工作”。例如:假设
      printf
      在执行时调用了
      malloc
      。如果发生这种情况,您可能会得到不同的结果。另一方面,
      printf
      可能在执行时调用了
      malloc
      ,而恰好没有使用您正在覆盖的内存。您只是不知道。您'您正在使用为其他目的保留的空间。该内存可能会或可能不会被您使用的任何东西写入