2017-07-31 60 views
0

我想解決從Hackerrank熱身挑戰非常微不足道的練習。通過指針和數組引用的對象

下面是代碼:

#include <math.h> 
#include <stdio.h> 

int* solve(int a0, int a1, int a2, int b0, int b1, int b2, int *result_size) 
{ 
    // Complete this function 
    int r[2]; 
    r[0] = 0; 
    r[1] = 0; 

    if(a0 > b0) 
     r[0] += 1; 
    else if(a0 < b0) 
     r[1] += 1; 

    if(a1 > b1) 
     r[0] += 1; 
    else if(a1 < b1) 
     r[1] += 1; 

    if(a2 > b2) 
     r[0] += 1; 
    else if(a2 < b2) 
     r[1] += 1; 
    //p = r; 
    *result_size = 2; 
    printf("The one %i and the two %i : \n", r[0],r[1]); 
    return r; 
} 

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); 
    printf("The ptr one %i and the ptr two %i : \n", result[0],*(result + 1)); 

    int i; 
    for(i = 0; i < 2; i++) 
     printf("%i ", result[i]); 
    printf(" result_size %i \n ", result_size); 

    int result_i; 
    for(result_i = 0; result_i < result_size; result_i++) 
    { 
     if(result_i) 
     { 
      printf(" "); 
     } 

     printf("%i", result[result_i]); 
    } 
    // puts(""); 


    return 0; 
} 

我得到的函數內部和主函數中一個很好的結果。但是當我嘗試迭代for循環中的「solve function」返回的數組時,它看起來像我正在獲取被引用對象的地址,而不是它的實際內容。我做錯了什麼?

+0

你的好結果是什麼,期望的輸出是什麼? –

+0

您正在返回本地變量的地址。 –

回答

0

您可以通過查看編譯器警告明白的問題:

警告:函數返回局部變量的地址

這意味着,在您的solve功能要返回的地址其中創建的變量,在這裏:

int* solve(int a0, int a1, int a2, int b0, int b1, int b2, int *result_size) 
{ 
    int r[2]; 
    ... 
    return r; 
} 

要理解爲什麼這是錯誤的,你需要明白,t他在函數內創建的變量存儲在堆棧內存中。當一個函數被調用時,將使用一個堆棧內存塊並將其所有變量存儲在其中,所以當相同的函數返回之前使用的堆棧塊被釋放時。

因此你不應該訪問在之外的函數中創建的變量,如果你這樣做,你會得到一個未定義的行爲。

爲了解決這個問題,你可以在堆中分配內存malloc,就像這樣:

int* solve(int a0, int a1, int a2, int b0, int b1, int b2, int *result_size) 
{ 
    int *r = malloc(sizeof(r) * 2); 
    ... 

現在內存在堆中分配和函數結束時將不會被清零。

不要忘記,當你不再需要時,應該調用free來釋放相應的內存塊。