从int数组中删除值

时间:2017-01-01 04:40:26

标签: c arrays segmentation-fault

我已经编写了这个小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);

我收到了分段错误。为什么呢?

Comment BLUEPIXY解析了

编辑 answerchqrlie here解释了它。谢谢你们!

1 个答案:

答案 0 :(得分:3)

您的代码没有按照您的想法执行:

  • arr被定义为指向100 int个元素的数组的指针。
  • arr[j]未指向偏移j处的元素,而是指向j指向的数组中的arr数组。
  • *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)

的行为完全相同