2016-04-09 18 views
-1

構造体へのポインタの配列を持っています。要素を削除し、残りの部分をすべて空白にすることです。私は機能していると思われる機能を書いたが、valgrindは「無効な読み書き/サイズ8の書き込み」という文句を言うので、私がしたことが間違っていたのか不思議だ。構造体へのポインタの配列から要素を削除する

ここでは、コードです:

for (int i = (numOfApartments-1); i >= 0; i--) { 
    if (apartmentIsIdentical(apartment, apartmentArray[i]->apartment)) { 
     apartmentDestroy(apartmentArray[i]->apartment); 
     free(apartmentArray[i]); 
     shiftApartments(apartmentArray, i, numOfApartments); 
     numOfApartments--; 
     return 1; 
    } 
} 

static void shiftApartments(ApartmentInfo* array, int startIndex, int endIndex) { 
    for (int i = startIndex; i < endIndex; i++) { 
     swapApartments(&array[i], &array[i + 1]); 
    } 
} 

static void swapApartments(ApartmentInfo* apartment1, ApartmentInfo* apartment2) { 
    ApartmentInfo temp = *apartment1; 
    *apartment1 = *apartment2; 
    *apartment2 = temp; 
} 

私の質問は無料(apartmentArray [i]は)正しいかどうかを主にですが。私はそれを見て、それは配列の最後に移動し、後で別の場所に配置する空のスロットを残す必要があります。しかし、 'サイズ8の無効な読み取り/書き込み'のエラーは、私がapartmentArray [i]を解放すると実際にスロットをアクセス不能にするかどうか疑問に思っていました。なぜ私はそれに書き込むことができないと言うのですか?

ありがとうございます!

+0

[mcve]を入力してください。コードはポインタの配列ではなく、 'ApartmentInfo'の配列を使用しているようです。 – Olaf

答えて

0

あなたはapartmentArrayを解放したので、[i]は、あなたが値を交換カント、

array[i] = array[i+1]; 
+0

値を入れ替えることができない場合、要素を削除するにはどうすればいいですか?私は「shiftApartmentsにポインタを割り当てるだけ」という意味を理解していませんでした。最初に要素をシフトしてから自由に使うとうまくいくのでしょうか?そのスロットをもう一度使うことができますか? – Anna

+0

あなたは値をswpしようとしてはいけません、ポインタを交換してください。 – Turo

0

memmove()

swapApartments(&array[i], &array[i + 1]); 

を交換するだけでshiftApartmentsにポインタを割り当てる

試みはあなたの友達ですここに。 Memmoveは、重複する動きを処理し、明示的なループを回避することができます。唯一の難点は、サイズを正しく得ることです!

(あなたが(解放しようとはならないことを除いて。私は、文字へのポインタの配列を使用しますが、これは、本質的に構造体へのポインタと変わらない)、それらは;-)

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
char *array[] = { "one", "two", "three", "four" 
       , "five", "six", "seven", "eight" }; 

     /* using an array of pointers to string literals 
     ** , so free() should not be used here ... 
     */ 
#define SHOULDFREE(s) fprintf(stderr,"Should free %s\n", s) 

unsigned size = 8; 
unsigned idx,top; 

for (top=idx=size; idx-- > 0; ) { 
       /* only delete words that start with 't' */ 
     if (*array[idx] != 't') continue; 
     SHOULDFREE(array[idx]); 
     top--; 
     if (idx >=top) continue; 
     fprintf(stderr,"about to move %u (%s) (%u elements) one place down\n" 
         , idx+1, array[idx+1], top-idx); 
     memmove(&array[idx], &array[idx+1], (top-idx) * sizeof array[0]); 
     } 
for (idx=0; idx < top; idx++) { 
     printf("[%u]: %s\n", idx, array[idx]); 
     } 
return 0; 
} 

そして、もちろん、

memmove(array+idx, array+idx+1, (top-idx) * sizeof array[0]);

memmove(&array[idx], &array[idx+1], (top-idx) * sizeof array[0]);

を置き換えることができます

関連する問題