【问题标题】:Remove values from an array of int从 int 数组中删除值
【发布时间】:2017-01-01 04:40:26
【问题描述】:

我编写了这个小 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 解决了它,answer chqrlie 解释了它。谢谢大家!

【问题讨论】:

  • *arr[j] --> (*arr)[j]
  • 你的函数没有使用idx?
  • 顺便说一句 remove_int(&amp;arr, 7, 2); --> remove_int(&amp;arr, 2, 7); ?
  • 另外你的数组有 7 个整数,从0-6 开始索引,但是你在调用remove_int() 时使用7。此外,为什么不改用int arr[] = {25, 4, 4, 1, 2, 1, 2};
  • @RoadRunner *arr[j] 正在寻找 0 - 据说。 int arr[] = {25, 4, 4, 1, 2, 1, 2}; 缺少 0。

标签: c arrays segmentation-fault


【解决方案1】:

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

  • arr 定义为指向包含 100 个 int 元素的数组的指针。
  • arr[j] 不指向偏移量j 处的元素,而是指向arr 指向的数组中的第jth 数组。
  • *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) 的行为完全相同

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 2019-11-14
    • 2015-02-22
    • 2021-11-20
    • 2019-04-12
    • 1970-01-01
    • 2021-01-10
    • 2023-03-15
    • 2012-07-22
    相关资源
    最近更新 更多