首页 > 解决方案 > 关于指针在 C 中如何工作的问题

问题描述

我正在为 C 中的类解决一个问题,我从未排序的数组中返回最大值,并且该值的索引存储在指针中index_ptr

这是我构建的代码:

int get_biggest_index(int array[], size_t array_size, int *index_ptr){
    int max = array[0], index;
    for (int i = 0; i < array_size-1; i++){
        if (array[i+1] > max){
            max = array[i];
            index = i;
        }
    }
    index_ptr = &index;
    printf("idx: %d\n", *index_ptr); //purely for testing
    return max;
}

我知道上面的工作是为了返回最高值,但在这种情况下运行它:

int main() {
    int arr[5] = {4, 7, 3, 9, 5};
    size_t arr_size = 5;
    int *idx;
    printf("biggest value in array arr => %d\n", get_biggest_index(arr, arr_size, idx));
    printf("idx of biggest value => %d", *idx);
    return 0;
}

输出是:

idx: 3
max value in array arr => 9
idx of max value => -98693133

有人可以具体解释一下为什么在指针的值方面会发生这种情况以及如何解决它吗?

我也很乐意听取有关其余代码的任何其他建议,因为我相信它会更好。

非常感谢你的帮助!

标签: cpointersintegeroutput

解决方案


该变量在函数内部index局部get_biggest_index的。它的生命周期将在函数返回时结束,任何指向它的指针都将变为无效。

虽然这不是这里的问题,因为index_ptr也是一个局部变量,当函数返回时它的生命周期结束时,它的值将丢失。

问题是您误解了在 C 中模拟传递引用的工作原理。您不应该传递指针,并使其指向函数中的变量。相反,您应该&在调用中使用指向运算符来传递指向现有变量的指针。然后在函数中取消引用指针来设置原始变量值。

像这样的东西:

int get_biggest_index(int array[], size_t array_size, int *index_ptr){
    int index;

    // ...

    *index_ptr = index;  // Set the *value*

    // ...
}

并将其称为:

int idx;  // Not a pointer
get_biggest_index(arr, arr_size, &idx);  // Pass pointer to the idx variable

推荐阅读