【问题标题】:C programming problems with realloc and memcpyrealloc 和 memcpy 的 C 编程问题
【发布时间】:2013-04-21 02:21:29
【问题描述】:

我是这个论坛的新手。提前感谢您的帮助。

每次我调用这个函数“agregar_segmento”时,我的全局指针都被命名为“segment” 应该调整大小以包含新的数据值​​。数据被定义为一个名为“typeSeg”的“结构”。

问题是每次我运行代码时都会收到不同的错误消息。 注意:我尝试使用 valgrind 但不明白返回的内容。

我的代码是:

typedef struct {
    char cmd[2];int nEnt;
    float x1;float y1;float z1;
    float x2;float y2;float z2;
} typeSeg;

static typeSeg *segmentos;
static int posSeg=0;
static int cantSeg=0;

void agregar_segmento(char *cmd,int nEnt, float x1,float y1,float z1,float x2,float y2,float z2){
    typeSeg aux;
    long new_size;
    long offset;
    strcpy(aux.cmd,(char*)cmd);
    aux.nEnt = nEnt;
    aux.x1=x1; aux.y1=y1; aux.z1=z1;
    aux.x2=x2; aux.y2=y2; aux.z2=z2;
    posSeg++;cantSeg++;
    new_size = sizeof(typeSeg) * posSeg;
    offset = (new_size - sizeof(typeSeg));
    printf("new_size = %lu , offset = %lu, size of my struct = %d\n",new_size,offset,sizeof(aux));
    if(posSeg==1){
        segmentos = (typeSeg*) malloc(new_size);
    }else{
        segmentos = (typeSeg*) realloc(segmentos,new_size);
    }
    memcpy((segmentos + offset), &aux,sizeof(typeSeg));
}

在我的程序中,这个函数从多个部分被多次调用(通常超过 5000 次)。

例子:

agregar_segmento("P",nEntidad,(xant1 == 0?px1:xant1),((yant1 == 0?py1:yant1)),atof("0.0"),px1,py1,atof("0.0"));

下面得到的错误信息。

错误 1

new_size = 32 , offset = 0, size of my struct = 32
new_size = 64 , offset = 32, size of my struct = 32
new_size = 96 , offset = 64, size of my struct = 32
new_size = 128 , offset = 96, size of my struct = 32
new_size = 160 , offset = 128, size of my struct = 32
......
......
new_size = 13024 , offset = 12992, size of my struct = 32
new_size = 13056 , offset = 13024, size of my struct = 32
new_size = 13088 , offset = 13056, size of my struct = 32
Segmentation fault

错误 2

new_size = 32 , offset = 0, size of my struct = 32
new_size = 64 , offset = 32, size of my struct = 32
new_size = 96 , offset = 64, size of my struct = 32
new_size = 128 , offset = 96, size of my struct = 32
new_size = 160 , offset = 128, size of my struct = 32
new_size = 192 , offset = 160, size of my struct = 32
......
......
new_size = 5440 , offset = 5408, size of my struct = 32
new_size = 5472 , offset = 5440, size of my struct = 32
Segmentation fault

错误 3

new_size = 32 , offset = 0, size of my struct = 32
new_size = 64 , offset = 32, size of my struct = 32
new_size = 96 , offset = 64, size of my struct = 32
new_size = 128 , offset = 96, size of my struct = 32
......
......
new_size = 1216 , offset = 1184, size of my struct = 32
new_size = 1248 , offset = 1216, size of my struct = 32
new_size = 1280 , offset = 1248, size of my struct = 32
craster: malloc.c:4630: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed.
Aborted

谁能不厌其烦地查看我的函数代码并给我意见?

我打印调试“new_size”和“offset”的值,以确保没有损坏的内存但有问题。

谢谢!

【问题讨论】:

    标签: c memory-management malloc memcpy realloc


    【解决方案1】:

    排队

    memcpy((segmentos + offset), &aux,sizeof(typeSeg));
    

    你正在传递一个指向

    的指针
    offset * sizeof(typeSeg)
    

    segmentos 后面的字节,而不是 offset 字节,如您所愿。指针算法会考虑指向对象的大小。

    传递要复制到的索引,

    memcpy((segmentos + posSeg-1), &aux,sizeof(typeSeg));
    

    或在添加偏移量之前将segmentos 转换为char*

    memcpy(((char*)segmentos + offset), &aux,sizeof(typeSeg));
    

    【讨论】:

    • 是的!谢谢,现在工作正常,我更好地理解了指针的使用。
    • 现在我必须提高我的英语水平:p
    • 与 'memcpy ((segments + posSeg-1), & aux, sizeof (typeSeg))' 配合得很好,但是当我多次调用该函数时,我收到以下错误:'*** glibc 检测到 *** invalid next size:',你知道怎么解决吗?
    • 可能是malloc/realloc失败了,你应该检查返回值,如果是NULL就退出。更有可能的是,在某些地方你写的越界。在 valgrind 下运行程序应该有助于检测它。
    【解决方案2】:

    segmentos + offset 的表达对我来说似乎是错误的。
    由于segmentostypeSeg * 类型,因此向其添加1 会增加整个typeSeg 的大小。
    如果想要第 N 段,需要使用segmentos + N

    【讨论】:

    • 是的!谢谢,现在工作正常,我更好地理解了指针的使用。
    猜你喜欢
    • 2010-09-26
    • 2011-01-18
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2011-08-30
    • 2012-05-23
    相关资源
    最近更新 更多