函数返回C中的指针

函数返回C中的指针,c,pointers,function-pointers,C,Pointers,Function Pointers,我解决了黑客等级的下一个挑战。我在网上搜索了一下,找到了一些关于函数指针的东西(我认为这会帮助我解决这个难题),但我没能解决它。我查看了网站上的讨论,找到了解决问题的方法。它并没有通过现场的所有测试用例,但它在7个测试用例中有5个成功。我不知何故复制了一些代码,运行了它,做了一些更改,运行了它等等,直到我得到了下面的版本。问题是,我仍然不明白它是如何工作的,为什么工作的,以及这种方法在这种情况下是否是最好的。这是我的代码: #include <math.h> #include <

我解决了黑客等级的下一个挑战。我在网上搜索了一下,找到了一些关于函数指针的东西(我认为这会帮助我解决这个难题),但我没能解决它。我查看了网站上的讨论,找到了解决问题的方法。它并没有通过现场的所有测试用例,但它在7个测试用例中有5个成功。我不知何故复制了一些代码,运行了它,做了一些更改,运行了它等等,直到我得到了下面的版本。问题是,我仍然不明白它是如何工作的,为什么工作的,以及这种方法在这种情况下是否是最好的。这是我的代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int* solve(int a0, int a1, int a2, int b0, int b1, int b2, int *result_size){
    static int ar[2] = {0, 0};
    *result_size = 2;
    ar[0] += a0 > b0;
    ar[0] += a1 > b2;
    ar[0] += a2 > b2;
    ar[1] += b0 > a0;
    ar[1] += b1 > a1;
    ar[1] += b2 > a2;
    return ar;
}

int main() {
    int a0; 
    int a1; 
    int a2; 
    scanf("%d %d %d", &a0, &a1, &a2);
    int b0; 
    int b1; 
    int b2; 
    scanf("%d %d %d", &b0, &b1, &b2);
    int result_size;
    int* result = solve(a0, a1, a2, b0, b1, b2, &result_size);
    for(int result_i = 0; result_i < result_size; result_i++) {
        if(result_i) {
            printf(" ");
        }
        printf("%d", result[result_i]);
    }
    puts("");


    return 0;
}
#包括
#包括
#包括
#包括
#包括

我不明白的是
int*solve
。这是怎么回事?我在SO上读了关于函数指针的问题,但我没有理解。为什么我必须使用
静态
数组?如果数组不是静态的,我的编译器(gcc)会说我不能返回局部变量的地址。同样在main中,
int*solve
不应该分配内存吗


(我应该在这里添加问题的“文本”而不是添加链接吗?

这里没有关于函数指针的内容
solve
是一个返回
int*
(指向
int
)类型的函数

为什么我必须使用静态数组

返回指向自动局部变量的指针会导致未定义的行为,因此使用
static
使其成为静态变量

另一种方法是在函数
solve

int *ar = malloc(sizeof (int) * 2);
memset(ar, 0, sizeof(ar));

在程序终止之前,静态变量为生命周期。这是一个返回整数指针的函数。因此程序执行时没有问题。虽然当静态变量位于共享对象下时,语义会略有变化,但上面的示例很普通。

这是一个返回指针的函数。这里没有函数指针。请相信,如果您从未使用/见过函数指针,那么第一次看到函数指针会比您在这里看到的要奇怪得多。代码挑战网站(无论是否是正式竞争)的理念是通过自己或研究解决问题(而不是从“告诉”网站复制代码)。“我不知何故复制了一些代码”,但想法是写你自己的代码,而不是问如何解决你糟糕的剽窃行为。请问一个关于C的具体问题。我投票将这个问题作为离题题题结束,因为你不理解你剽窃的代码。@WeatherVane我的问题不是关于解决挑战。这是关于C的。我对解决这个挑战不感兴趣。我很想了解我所问的问题。我有没有问过“如何解决这个挑战?”?我使用挑战是因为我想学习,有时我不知道我应该学什么。我学习不是因为我想解决这些挑战。我投票决定回答这个问题。这样做是否有自己的学习方式,而我在这种情况下使用的方式是错误的?让我知道。非常感谢。