如何在不将它作为C中函数的返回值的情况下修改int指针?

时间:2017-02-10 20:13:29

标签: c pointers

我想记录不同递归函数的调用次数,而不需要调用次数作为函数的返回值。

例如,我想知道对于不同的密钥进行二进制搜索会发生多少函数调用。

int binarySearch (int key, int array[], int lo, int hi, int *recursiveCalls) {
    recursiveCalls++;

    if (lo > hi) return -1;

    else if (lo == hi) {
        if (key == array[lo]) return lo;
        else return -1;
    }

    else {
        int mid = (lo+hi)/2;

        if (key < array[mid])
            return binarySearch(key, array, lo, mid-1, recursiveCalls);
        else if (key > array[mid])
            return binarySearch(key, array, mid+1, hi, recursiveCalls);
        else
            return mid;
    }
}

int main(int argc, char const *argv[]) {
    int array[10] = {1, 4, 6, 7, 10, 13, 15, 17, 18, 21};
    int *recursiveCalls = 0;
    int index = binarySearch (13, array, 0, 9, recursiveCalls);
    printf ("Number of recursive calls = %d times.\n", *recursiveCalls);
    return 0;
}

但是,这会导致分段错误。

2 个答案:

答案 0 :(得分:2)

你不能在主指针中传递指向0的指针。用以下代码修复:

#include<stdio.h>

int binarySearch (int key, int array[], int lo, int hi, int *recursiveCalls) {
    (*recursiveCalls)++;
    if (lo > hi) return -1;

    else if (lo == hi) {
        if (key == array[lo]) return lo;

        else return -1;
    }

    else {
        int mid = (lo+hi)/2;

        if (key < array[mid])
            return binarySearch(key, array, lo, mid-1, recursiveCalls);
        else if (key > array[mid])
            return binarySearch(key, array, mid+1, hi, recursiveCalls);
        else
            return mid;
    }
}

int main(int argc, char const *argv[]) {
    int array[10] = {1, 4, 6, 7, 10, 13, 17, 16, 18, 21};
    int recursiveCalls = 0;
    int index = binarySearch (13, array, 0, 9, &recursiveCalls);
    printf ("Number of recursive calls = %d times.\n", recursiveCalls);
    return 0;
}

答案 1 :(得分:1)

你被C语言中那些令人讨厌的特性所欺骗。

通常,可以指定给指针的值必须是指针类型,与指定的指针类型相同。 (或者可以隐式转换为它,但让我们保持简单。)因此,例如,您不能说char* p = 'a';因为p属于char*类型,而'a' }类型为char。 (一个是指针,另一个不是。)

然而,C做了一个例外:整数常数为零。将整数常量0指定给指针时,C将指针设置为NULL。

因此,您尝试将recursiveCalls指针设置为指向初始值通常会被编译器标记为错误,因为您试图将int分配给{{ 1}},但它没有被标记,因为C专门处理int*整数文字,将指针设置为NULL。

所以,你的情况下的修复是先分配一个这样的变量:0,然后设置你的指针指向它,如下所示:int recursiveCallCount; recursiveCallCount = 0;