2017-08-09 169 views
-2

我解決了黑客級別上的下一個挑戰。我搜索了互聯網,發現了一些關於函數指針的信息(我認爲這些信息將幫助我解決挑戰),但是我無法解決它。我查看了網站上的討論,並找到了解決問題的方法。它沒有通過網站上的所有測試用例,但它在7箇中有5個。我以某種方式複製了一些代碼,運行它,進行了一些更改,運行它等等,直到獲得以下版本。問題是,我仍然不明白它是如何工作的,以及這種方法在這種情況下最好用。這是我的代碼:函數返回指針C

#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。這是如何運作的?我讀過關於函數指針的問題,但我沒有得到它。爲什麼我必須使用static數組?如果數組不是靜態的,我的編譯器(gcc)說我不能返回局部變量的地址。還主要不應該int* solve有內存分配?

(我應該在這裏增加了問題的「文本」,而不是添加的鏈接?)

+2

這是一個返回指針的函數。這裏沒有函數指針。 –

+1

相信如果你從來沒有使用/看過函數指針,首次看到一個函數指針會比你在這裏看到的更奇怪。 – WhozCraig

+1

代碼挑戰網站(無論是否正式比賽)的想法是自己或通過研究解決問題(但不是通過複製「告訴」網站的代碼)。 「我以某種方式複製了一些代碼」,但想法是編寫自己的代碼,而不是要求如何解決你的剽竊問題。請問一個關於C的具體問題。 –

回答

2

沒有任何關於此函數指針。 solve是返回int *(指向int)類型的函數。

爲什麼我必須使用靜態數組?

返回指向自動局部變量的指針會導致未定義的行爲,因此使用static使其成爲靜態變量。

其他方式是在功能動態分配空間solve

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

靜態變量是生命定時直到程序終止。這是一個函數,返回指向整數的指針。所以程序執行沒有問題。雖然當靜態變量位於共享對象下時,語義會稍微改變,但上面的例子是普通的香草風味。