0

C で 2 つの関数を記述しようとしています。そのうちの 1 つは引数として渡す配列の末尾に要素を追加し、もう 1 つは引数として渡された配列から要素を削除します。

私は C にあまり詳しくなく、ポインター演算が苦手です。

私はこのようなことを試しましたが、正しく動作していないようです:

void remove_element(type *elements, type element, int size){
    int i;
    int index = 0;
    for(i=0; i<size; i+=1){
        if(equals(elements[i], element)) index = i;
    }

    for(i=index; i<size-1; i+=1){
        elements[i] = elements[i+1];
    }
}


void add_element(type *elements, type element, int size){
    elements = realloc(elements, size*sizeof(element));
    elements[size-1] = element;
}

それが私が関数を呼び出す方法です:

add_element(elements, new_element, size);
remove_element(elements, element_to_remove, size);
4

1 に答える 1

1

次の 2 行は、未定義の動作を引き起こす可能性があります。

cvorovi = realloc(elements, size*sizeof(element));
elements[size-1] = cv;

このrealloc関数は、再割り当てする同じ領域へのポインターを返すことが保証されていませelementsん。つまり、呼び出し後に割り当てられた領域を指していない可能性があります。返されたポインターを使用する必要があります。

これにより、この関数を呼び出すコードで問題が発生する可能性が高くなります。そのコードはポインターの変更について何も認識しないためです。参照渡しelements(つまり、ポインターへのポインター) するか、新しいポインターを返します。

また、編集を見た後、?を呼び出すときに現在のサイズよりも大きなサイズを渡すことを忘れないでくださいadd_elementそうしないと、同じサイズが何度も再割り当てされ、呼び出しごとに最後に挿入された要素が上書きされます。これらを追跡する構造体と、この構造体を引数として取り、内部ですべてのものを処理する特別な関数のセット (サイズの追跡など) を作成することを検討することをお勧めします。

于 2013-11-02T22:20:01.027 に答える