C 从指向结构的指针数组中删除元素

C 从指向结构的指针数组中删除元素,c,arrays,pointers,struct,valgrind,C,Arrays,Pointers,Struct,Valgrind,我有一个指向结构的指针数组,我想做的是删除一个元素并移动所有其余的元素以填补空白。我写了一个函数,它似乎可以工作,但是valgrind抱怨“大小为8的无效读/写”,所以现在我想知道我所做的是否是错误的 代码如下: for (int i = (numOfApartments-1); i >= 0; i--) { if (apartmentIsIdentical(apartment, apartmentArray[i]->apartment)) { apartme

我有一个指向结构的指针数组,我想做的是删除一个元素并移动所有其余的元素以填补空白。我写了一个函数,它似乎可以工作,但是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;
}
for(int i=(numf-1);i>=0;i--){
if(公寓式(公寓式,公寓式阵列[i]->公寓式)){
apartmentDestroy(apartmentArray[i]->公寓);
免费(公寓阵列[i]);
shiftApartments(公寓阵列,i,Numof公寓);
努莫夫公寓;
返回1;
}
}
静态void shiftApartments(ApartmentInfo*数组、int startIndex、int endIndex){
对于(int i=startIndex;i
我的问题主要是free(apartmentArray[i])是否正确。在我看来,它应该留下一个空插槽,我只是移动到数组的末尾,然后在那里放置其他东西。然而,“大小为8的无效读/写”错误使我怀疑释放apartmentArray[i]是否会使插槽无法访问。。?为什么它说我不能给它写信


谢谢

由于释放了apartmentArray[i],因此无法交换值,只需在shiftApartments中分配指针即可

试着替换

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

memmove()
是你的朋友。Memmove处理重叠移动的情况,可以避免显式循环。唯一的困难是把尺寸弄对

(我使用一个指向字符的指针数组,但这与指向结构的指针基本上没有什么不同,只是您不应该尝试释放()它们;-)

#包括
#包括
内部主(空)
{
字符*数组[]={“一”、“二”、“三”、“四”
","五","六","七","八",;
/*使用指向字符串文本的指针数组
**,因此此处不应使用free()。。。
*/
#定义SHOULDFREE(s)fprintf(stderr,“应释放%s\n”,s)
无符号大小=8;
未签名的idx,顶部;
对于(top=idx=size;idx-->0;){
/*仅删除以“t”开头的单词*/
如果(*数组[idx]!=“t”)继续;
SHOULDFREE(数组[idx]);
顶部--;
如果(idx>=顶部)继续;
fprintf(stderr,“即将将%u(%s)(%u个元素)向下移动一个位置\n”
,idx+1,数组[idx+1],顶部idx);
memmove(&array[idx],&array[idx+1],(顶级idx)*sizeof array[0]);
}
对于(idx=0;idx
当然还有

memmove(&array[idx],&array[idx+1],(顶级idx)*sizeof array[0])

可替换为:


memmove(数组+idx,数组+idx+1,(顶级idx)*sizeof数组[0])

那么,如果无法交换值,如何删除元素?我不太明白“只在shiftApartments中分配指针”是什么意思。如果我先移动元素,然后使用free,它会工作吗?我可以再次使用该插槽吗?请提供一个。代码似乎没有使用指针的am数组,而是使用
ApartmentInfo
的数组。
array[i] = array[i+1];
#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;
}