丢弃C数组中的重复元素/走出数组边界

时间:2017-01-20 08:05:16

标签: c arrays

以下代码会丢弃数组中的重复元素。

#include<stdio.h>

int main() {
    int arr[5] = {1,2,2,3,5};
    int i, j, k, size = 5;


    printf("\nArray with Unique list  : ");
    for (i = 0; i < size; i++) {
        for (j = i + 1; j < size;) {
            if (arr[j] == arr[i]) {
                for (k = j; k < size; k++) {
                    arr[k] = arr[k + 1];  //line in question
                }
                size--;
            } else
                j++;
        }
    }

    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }

    return (0);
}

在上面的问题中。当k = 4时,arr[k] = arr[k + 1];的右侧将超出数组边界。

我的问题是arr[4] = arr[5];有效吗?为什么?

添加了问题:

如果它无效,为什么会有效?

代码来源:http://www.c4learn.com/c-programs/to-delete-duplicate-elements-in-array.html

3 个答案:

答案 0 :(得分:2)

  

我的问题是arr [4] = arr [5];有效?为什么?

由于你指出的确切原因,它是无效的:越界数组访问。

答案 1 :(得分:1)

离开边界时未定义的行为。 您无法保证阵列的位置,您可以尝试写入 你没有权限的地方。因此,你无法说出究竟会发生什么。

答案 2 :(得分:1)

1.我的问题是arr [4] = arr [5];有效?为什么?
它因错误而无效:array access out of bound

2.如果无效,为何有效?
你在a[5] = *(a+5)之类的某个地方取消引用一个值,如果操作系统允许你访问它将运行的那个区域,它会给你一些价值,否则它会崩溃,所以如果它是内存中的一个限制区域,那么行为是不确定的会发生崩溃。