首页 > 解决方案 > 如何删除二维字符数组指针的一项

问题描述

我正在使用一个二维字符数组指针,换句话说,一个字符串数组的数组。这个指针在一个内部struct,我正在尝试删除一个字符串数组。

换句话说,如果我有以下数组:

{ { "Foo", "Bar" }, { "Baz", "Fee" }, { "Var", "Bar" } }

我正在尝试删除中间数组

{ { "Foo", "Bar" }, { "Var", "Bar" } }

以下struct

struct Data {
    int size;

    char(*items)[10][64];
}

我尝试迭代数组并将前面的位置向后移动,如下所示(假设我试图消除位置 1)

int positionInArray = 1;
// Suppose that data struct is filled
for (int x = positionInArray; x < data->size; x+ ) {
  (*(*data->items[x])) = (*(*data->items[x+1]));
}

我不确定这是正确的方法,显然我无法删除该项目。

标签: carrayspointersmultidimensional-array

解决方案


如果您使用普通的数组索引而不是指针取消引用,则不会那么混乱。您可以使用memcpy()一次复制整行。

如果字符串是动态分配的,那么在移动数组元素之前,您需要释放要删除的行所指向的项目。

for (int x = 0; x < sizeof(data->items[0])/sizeof(data->items[0][0]); x++) {
    free(data->items[positionInArray][x]);
}

那么你的for循环移动行的限制应该是size-1,否则你会尝试将行复制到最后一个有效行之后。

for (int x = positionInArray; x < data->size-1; x++) {
    memcpy(data->items[x], data->items[x+1], sizeof(data->items[x]));
}

data->size--;

推荐阅读