帮助我理解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
,而恰好没有使用您正在覆盖的内存。您只是不知道。您'您正在使用为其他目的保留的空间。该内存可能会或可能不会被您使用的任何东西写入