我解决了黑客级别的下一个挑战。我搜索了互联网并发现了一些关于函数指针的东西(我认为它可以帮助我解决这个问题),但我无法解决它。我查看了网站上的讨论,我找到了解决问题的方法。它没有通过网站上的所有测试用例,但它在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;而不是添加链接吗?)
答案 0 :(得分:2)
这里没有关于函数指针的信息。 solve
是一个返回int *
(指向int
)类型的函数。
为什么我必须使用静态数组?
返回指向自动局部变量的指针会导致未定义的行为,因此static
用于使其成为静态变量。
其他方法是在函数solve
int *ar = malloc(sizeof (int) * 2);
memset(ar, 0, sizeof(ar));
答案 1 :(得分:2)
静态变量是终生的,直到程序终止。这是一个返回指向整数的指针的函数。所以程序执行没有问题。虽然静态变量在共享对象下时语义略有改变,但上面的例子是普通的香草味。