1

このプログラムは、動的メモリ ベクトルを作成することになっています。私はmallocを正しく使用していると確信しています。私の本当の問題は、ポインターを使用した構文、特に構造体内のポインターです。

構造体内の int ポインターのアドレスにアクセスしようとしているので、別のポインターに割り当てることができます

私の与えられた構造体は次のとおりです。

typedef struct{
int *items;
int capacity;
int size;
}VectorT;

私が仕事をしようとしている機能は次のとおりです。

int getVector(VectorT *v, int index){
    int *p;
    p = v->items;//(2)
    p -= v->size;
    p += index;
    return *p;
}

これは、項目ポインタのアドレスからリスト内の項目数を減算し、目的の項目のインデックスを p のアドレスに追加することになっています。次に、p のアドレスにあるものを返します。

行 (2) は必要な構文ではないとかなり強く感じています。

これまでに試したことに応じて、getVector が呼び出されたときにプログラムがクラッシュするか、(私の推測では) いくつかのメモリ ロケーションが出力されます。

ベクトルを追加するコードは次のとおりです。

void addVector(VectorT *v, int i){
        if(v->size >= v->capacity){
            //allocate twice as much as old vector and set old pointer to new address
            v = (VectorT *) malloc(2 * v->capacity * sizeof(VectorT));
            if(v == NULL){
                fprintf(stderr, "Memory allocation failed!\n");//error catch
            }
            else{
                v->capacity *= 2;//double the reported capacity variable
                v->size++;//add one to the reported size variable
                v->items =(int *) i;//add the item to the vector (A)<-----
            }   
        }
        else{
            v->size++;//add one to the reported size variable
            v->items =(int *) i;//add the item to the vector (B)<-----
        }
}

私の問題はここにあるとは思いませんが、問題がある場合は、ライン A と B に疑いがあります...

どんな洞察も大歓迎です、ありがとう!

4

3 に答える 3

3

ポインターの扱いは、少なくとも次の場所で間違っています。

  • 「ベクターに項目を追加する」というコメントを含むコードは非常に間違っています。項目を追加する代わりに、ポインターを任意のint.

v->items =(int *) i;

する必要があります

*(v->items) = i;
  • ポインター演算が正しくありません。サイズを減算してインデックスを追加すると、割り当てられた領域の先頭より前にポインターが取得されますが、これは正しくありません。

  • の結果を「ベクトルへのポインター」タイプmallocのローカル変数に代入しています。vポインターは値によって渡されるため、この割り当ては呼び出し元では効果がありません。でベクトルを再設定したい場合は、最初のパラメータとして使用addVectorする必要があります。VectorT **pvこのコード フラグメントはまったく正しくありません。v->items=malloc(2 * v->capacity * sizeof(int))代わりに代入する必要があるようです。v=malloc(...)

  • を実行するときに古いベクトルを解放しないmallocと、メモリ リークが発生します。

于 2012-07-02T19:19:41.607 に答える
1

したがって、iのアドレスが必要です。

v->items =&i;//add the item to the vector (A)<-----

また、必要なサイズを計算するときは、次のようにします。

p -= (v->size*sizeof(int));

アップデート:

iへのポインタをgetVectorに渡して、それを保存することもできますv->items

 int getVector(VectorT *v, int *index)
 //...
 v->items = i;
于 2012-07-02T19:12:49.190 に答える
1

VectorT.items にメモリを割り当てる必要があるときに、VectorT にメモリを割り当てているようです。

void addVector(VectorT *v, int i){
        if(v->size >= v->capacity){
            //allocate twice as much as old vector and set old pointer to new address
            v->items
            int* tmp = malloc(2 * v->capacity * sizeof(int));
            if(tmp == NULL){
                fprintf(stderr, "Memory allocation failed!\n");//error catch
            }
            else{
                int j;
                for (j = 0; j < v->size; j++){
                    tmp[j] = v->items[j];
                }
                free(v->items);
                v->items = tmp;
                v->capacity *= 2;//double the reported capacity variable
                v->items[v->size] = i;//add the item to the vector (A)<-----
                v->size++;//add one to the reported size variable
            }   
        }
        else{
            v->items[v->size] = i;//add the item to the vector (B)<-----
            v->size++;//add one to the reported size variable
        }
}

int getVector(VectorT *v, int index){
    return v->items[index]
}
于 2012-07-02T19:38:42.717 に答える