结构的动态数组

用户名
#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个数组单元。

cmaster-恢复莫妮卡

如果所访问的地址后面没有内存,则只会出现分段错误。从物理意义上讲,这是首先通过硬件而不是软件来发出段错误信号。现在,物理内存映射始终以完整页面的形式发生。在大多数硬件上为4 kiB。您要求的大小realloc()仅为16个字节。

当然,realloc()返回的地址后面必须有内存因此,在您的结构周围必须至少有4080个地址,在硬件看来,该地址与属于该结构本身的16个地址一样有效。这意味着硬件无法向您的操作系统发出信号,表明可能有问题,并且您的操作系统无法向您发送分段错误。如果尝试访问v[1000]可能会遇到段错误,但是即使这样也不能确定。

这并不意味着您被允许访问这些地址,仅意味着您在访问它们时不能依靠段错误。可能还有其他分配可以破坏您的工作,或更糟的是,可能有信息站在那儿,哪个malloc用于确定使用了哪些内存区域,哪些没有使用。如果您访问所请求的区域之外的任何地址realloc(),则您的程序具有未定义的行为,并且可能会发生任何事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章