1

このフォーラムは初めてです。助けてくれてありがとう。

この関数「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」の値をデバッグするために印刷して、メモリが破損していないことを確認しますが、何か問題があります。

ありがとう!

4

2 に答える 2

1

その表現segmentos + offsetは私には間違っているようです。は 型な
ので、これに 1 を加えると全体のサイズが加算されます。 N 番目のセグメントが必要な場合は、 を使用する必要があります。segmentostypeSeg *typeSeg
segmentos + N

于 2013-04-26T20:15:08.613 に答える
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));
于 2013-04-26T20:15:33.950 に答える