【发布时间】:2019-05-26 14:19:39
【问题描述】:
我的问题是,当我按照以下代码为 go 变量分配内存时,我可以到达我没有分配的区域(在这种情况下,在第一个区域之后)。那么这个最高到达点的限制是什么,因为当我尝试打印或访问千位时,我会遇到分段错误。 OS(Ubuntu 18.04)如何限制这个区域?
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
int *go=NULL;
go = malloc(sizeof(int)*1);
*go = 190;
*(go+1)=20;
*(go+2)=-13;
*(go+3)=450;
*(go+4)=140;
*(go+5)=190;
printf("%d\n",*(go));
printf("%d\n",*(go+1));
printf("%d\n",*(go+2));
printf("%d\n",*(go+3));
printf("%d\n",*(go+4));
printf(">>>%d\n",*(go+5));
return 0;
}
【问题讨论】:
-
恐怕这是未定义的行为。
-
"操作系统如何限制这个区域?" - 究竟是哪个操作系统?
-
在这种情况下是 Ubuntu 18.04.02
-
这是未定义的行为。在一个系统上,即使尝试访问
malloc()返回的内存末尾之后的内存也可能会崩溃。在另一个系统上,您可能能够顺利通过,因为malloc()的实现过度分配。在任何特定机器上,行为也可能随着时间而改变,例如,由于其他进程如何使用内存。 -
访问您的应用程序不拥有的内存是未定义的行为。 IE。任何事情都可能发生。
标签: c memory-management malloc