C-从int数组中删除值



我已经写了这个小的C函数以从数组中删除整数。

/* remove `count` integers from `arr`, starting at index `idx` */
void remove_int(int (*arr)[100], int idx, int count)
{
    int i, j;
    for (i = 0; i < count; i++)
        for (j = idx; *arr[j]; j++)
            *arr[j] = *arr[j+1];
}

说我这样运行:

int arr[100] = {25, 4, 4, 1, 2, 1, 2};
remove_int(&arr, 7, 2);

我会得到一个分段故障。为什么?

edit bluepixy解决了该问题,Chqrlie的回答解释了。谢谢大家!

您的代码不执行您认为做的事情:

  • arr定义为指向100 int元素的数组。
  • arr[j]并不指向偏移j的元素,而是指向arr指向的数组中的j TH数组。
  • *arr[j]删除位置的整数arr[j][0],远远超出了arr数组的末端。

如果保留相同的API,则应以这种方式写代码:

/* remove `count` integers from `arr`, starting at index `idx` */
void remove_int(int (*arr)[100], int idx, int count) {
    int i, j;
    for (i = idx + count; i < 100 && (*arr)[i]; i++)
        (*arr)[i - count] = (*arr)[i];
    for (j = 0; j < count && i - count + j < 100; j++) {
        (*arr)[i - count + j] = 0;
}

在C处理数组的指针中不是惯用的,直接传递数组是更常见的,而所谓的函数接收到对数组的第一个元素的指针。

然后将这种函数称为:

int arr[100] = {25, 4, 4, 1, 2, 1, 2};
remove_int(arr, 7, 2);

,该函数将以这种方式写入:

/* remove `count` integers from `arr`, starting at index `idx` */
void remove_int(int arr[100], int idx, int count) {
    int i, j;
    for (i = idx + count; i < 100 && arr[i]; i++)
        arr[i - count] = arr[i];
    for (j = 0; j < count && i - count + j < 100; j++) {
        arr[i - count + j] = 0;
}

在这种情况下,[100]数组大小被忽略,并且该功能的行为与将其定义为void remove_int(int *arr, int idx, int count)

完全相同

相关内容

  • 没有找到相关文章