#include <stdio.h>
#include <stdlib.h>
struct ver{
double x;
double y;
};
struct ver *v=NULL;
int main(){
v=(struct ver*)realloc(v,1*sizeof(struct ver));
v[0].x=1.444;
v[0].y=1.555;
v[1].x=1.333;
v[1].y=1.222;
v[3].x=1.111;
v[3].y=1.777;
v[8].x=1.999;
v[8].y=1.888;
printf("x:%f y:%f \n", v[0].x, v[0].y);
printf("x:%f y:%f \n", v[1].x, v[1].y);
printf("x:%f y:%f \n", v[3].x, v[3].y);
printf("x:%f y:%f \n", v[8].x, v[8].y);
}
结果是:
x:1.444000 y:1.555000
x:1.333000 y:1.222000
x:1.111000 y:1.777000
x:1.999000 y:1.888000
我应该不会出现细分错误?它忽略重新分配。我想制作一个结构数组,我想每次扩展1个数组单元。
如果所访问的地址后面没有内存,则只会出现分段错误。从物理意义上讲,这是首先通过硬件而不是软件来发出段错误信号。现在,物理内存映射始终以完整页面的形式发生。在大多数硬件上为4 kiB。您要求的大小realloc()
仅为16个字节。
当然,realloc()
返回的地址后面必须有内存。因此,在您的结构周围必须至少有4080个地址,在硬件看来,该地址与属于该结构本身的16个地址一样有效。这意味着硬件无法向您的操作系统发出信号,表明可能有问题,并且您的操作系统无法向您发送分段错误。如果尝试访问v[1000]
,可能会遇到段错误,但是即使这样也不能确定。
这并不意味着您被允许访问这些地址,仅意味着您在访问它们时不能依靠段错误。可能还有其他分配可以破坏您的工作,或更糟的是,可能有信息站在那儿,哪个malloc用于确定使用了哪些内存区域,哪些没有使用。如果您访问所请求的区域之外的任何地址realloc()
,则您的程序具有未定义的行为,并且可能会发生任何事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句