首页 > 解决方案 > 无法在 C 中返回正确的变量

问题描述

我想尝试使用 C 编写 Kadane 算法。我不仅想返回最大子数组值,还想返回开始和结束索引。

这是代码:

#include <limits.h>
#include <stdio.h>

int kadane(int A[], int size){
    int current_max = INT_MIN;
    int global_max = INT_MIN;
    int start, last;

    for (int i = 0; i <= size; i++){
        if (A[i] > A[i] + current_max){
            current_max = A[i];
            start = i;
        } else {
            current_max += A[i];
        };

        if (current_max >= global_max){
            global_max = current_max;
            last = i;
        };
    };
    return (start, last ,global_max);
}

int main(){
    int sum, size, start, last;
    int A[] = {3,-4,5,1,9,-10,11,2,5,-1,2};
    size = sizeof(A)/sizeof(A[0]);

    start, last, sum = kadane(A, size-1);
    printf("start at %d ; end at %d; sum : %d\n", start, last, sum);
    return 0;
}

虽然最大和的答案是对的,但是 start 和 last 的值真的很奇怪。我在 kadane 函数的 for 循环中使用 printf 检查 start 和 last 的值,它似乎在那里工作正常。所以我认为这个问题可能与我返回变量的方式有关。

所以我修改了部分代码,如下所示:

int kadane(int A[], int size){
    ......
    ......
    return (&start, &last ,global_max);
}

然后使用指针来存储它们:

int main(){
    .......
    .......
    int *start;
    int *last;

    *start, *last, sum = kadane(A, size-1);
    printf("start at %d ; end at %d; sum : %d\n", *start, *last, sum);
    return 0;
} 

然后我收到“Segmentation Fault 11”错误。

我试图理解和搜索我在这里做错了什么,但我找不到它。唯一可行的解​​决方案是将变量 start 和 last 存储在全局中,这样我就可以在任何地方调用而无需返回。但我觉得这样不是一个合适的解决方案。有人能帮我一下吗?

标签: c

解决方案


你有两个解决方案:

1:返回一个包含您需要的所有类型的结构。

struct data {
    int start;
    int last;
    int global_max;
};
struct data kadane(int A[], int size){
    stuct data test = { 1, 1, 1 };
    ......
    ......
    return test;
}

void main() {
    ......
    struct data t = kadane(A, ize);
}

2:使用指针传递值。

void kadane(int A[], int size, int *start, int *last, int *global_max) {
    ......
    ......
    *start = 1;
    *last= 1;
    *global_max= 1;
}

void main() {
    ......
    int a, b, c;
    kadane(A, size, &a, &b, &c);
}

如何从 C 中的函数返回多个值?


推荐阅读