函数在C中返回指针

时间:2017-08-09 19:10:45

标签: c pointers function-pointers

我解决了黑客级别的下一个挑战。我搜索了互联网并发现了一些关于函数指针的东西(我认为它可以帮助我解决这个问题),但我无法解决它。我查看了网站上的讨论,我找到了解决问题的方法。它没有通过网站上的所有测试用例,但它在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;
}

这是问题的链接:https://www.hackerrank.com/challenges/compare-the-triplets/problem

我不明白的是int *solve。这是如何运作的?我在SO上阅读了有关函数指针的问题,但我没有得到它。为什么我必须使用static数组?如果数组不是静态的,我的编译器(gcc)说我不能返回局部变量的地址。主要不应该int* solve分配内存吗?

(我应该在这里添加&#34;文本&#34;而不是添加链接吗?)

2 个答案:

答案 0 :(得分:2)

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

  

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

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

其他方法是在函数solve

中动态分配空间
int *ar = malloc(sizeof (int) * 2);
memset(ar, 0, sizeof(ar));

答案 1 :(得分:2)

静态变量是终生的,直到程序终止。这是一个返回指向整数的指针的函数。所以程序执行没有问题。虽然静态变量在共享对象下时语义略有改变,但上面的例子是普通的香草味。