数组越界检查(带函数)

时间:2016-04-18 02:11:10

标签: c arrays function

我是C编程的新手,我有两个关于我的作业任务的问题已经上交。我不是在问怎么做,我问的是我做错了什么(我的TA说我做错了两件事) 。我不得不使用这两个功能。 (很抱歉这个问题很长。我也是这个网站的新手,所以我不知道这是否也是一个合适的问题。)

这些是我作业中给出的数字,这是我的插入和第二个代码。

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

void insert(int a[], int size, int key, int k){

    a[k] = key;

}

我的TA曾说过我没有检查k是否在指数范围内,而且我对如何检查是否感到困惑。我想知道如何,因为我知道这对我专业的未来项目很重要。

对于第二个函数,我必须抓住数组中最大的第二大元素并将其放入第0个元素中。唯一的问题是它将12放入第0个元素而不是11个。我从未理解如何做到这一点。

void second(int a[], int size){

int j = 0;

int b, c, i = 0;

int temp = 0;

int pos,pos1;

for ( b = 0; b<(size-1); b++){
    if(a[b] < a[b+1]){
        pos = b+1;
    }
}
for (b = 0; b<(size-1); b++){
    if ( a[i] < a[b+1] && pos != b-1){
        pos1 = b+1;
        i++;
    }

    temp = a[0];
    a[0] = a[pos1];
    a[pos1] = temp;
}

谢谢你的帮助! (任何其他评论都是可以接受的,例如,如果我的编码很糟糕,我认为是这样)。

2 个答案:

答案 0 :(得分:5)

是的,你的TA是对的,你应该检查索引是否在数组的范围内。

void insert(int a[], int size, int key, int k) {
    if (k < 0 || k >= size) {
        // error: k out of bound!
        return;
    }
    a[k] = key;
}

要找到数组中第二大的元素,并将其放入[0],您可以在一次循环中执行此操作:

void second(int a[], int size) {
    int first, second;
    int i;

    first = 0;
    second = 0;
    for (i = 0; i < size; i++) {
        if (a[i] > a[first]) {
            second = first;
            first = i;
        } else if (a[i] > a[second] && a[i] != a[first])
            second = i;
    }

    int temp = a[0];
    arr[0] = a[second];
    a[second] = a[0];
}

答案 1 :(得分:3)

第一个问题: 检查k是否在范围内0..(size-1)

if ((k>=0)&&(k<size))
    a[k] = key;

第二个问题: for循环应该在size之前,直到size-1。 尝试在if语句中对术语进行分组:

if ( (a[b] < a[b+1]) && (pos != b-1))