【问题标题】:Function returning a pointer in C在C中返回指针的函数
【发布时间】:2017-08-09 19:10:44
【问题描述】:

我解决了黑客等级的下一个挑战。我在互联网上搜索并找到了一些关于函数指针的东西(我认为这将帮助我解决挑战),但我无法解决它。我查看了网站上的讨论,并找到了解决问题的方法。它没有通过网站上的所有测试用例,但它适用于 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)说我不能返回局部变量的地址。同样在 main 中,int* solve 不应该分配内存吗?

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

【问题讨论】:

  • 这是一个返回指针的函数。这里没有函数指针。
  • 相信如果你从未使用过/见过函数指针,那么第一次看到函数指针会比你在这里看到的要奇怪得多。
  • 代码挑战网站(无论是否正式比赛)的想法是通过自己或研究解决问题(而不是通过从“告诉”网站复制代码)。 “我以某种方式复制了一些代码”,但想法是编写您自己的代码,而不是问如何解决您的不良抄袭。请询问有关 C 的具体问题。
  • 我投票结束这个问题,因为你不理解你抄袭的代码。
  • @WeatherVane 我的问题不是解决挑战。它专门针对 C。我主要不是对解决挑战感兴趣。我有兴趣了解我提出的问题。我有没有问过“如何解决挑战?”?我使用挑战是因为我想学习,但有时我不知道我应该学习什么。我不学习是因为我想解决这些挑战。我正在投票回答这个问题。 SO是否有自己的学习方式,而我在这种情况下使用的学习方式是错误的?让我知道。谢谢!

标签: c pointers function-pointers


【解决方案1】:

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

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

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

另一种方法是在函数solve中动态分配空间

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2012-02-26
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多