通过指针和数组引用对象

时间:2017-07-31 17:11:41

标签: arrays pointers

我正试图通过Hackerrank Warmup挑战来解决一个非常微不足道的练习。

以下是代码:

#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;
}

我在函数内部和main函数内部获得了良好的结果。但是当我尝试迭代从&#34;解决函数&#34;返回的数组时在for循环中,似乎我得到了引用对象的地址,但不是它的实际内容。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您可以通过查看编译器警告来了解问题:

  

警告:函数返回局部变量的地址

这意味着在System.Media函数中,您将返回在其中创建的变量的地址,此处:

solve

要理解为什么这是错误的,你需要理解在函数内创建的变量存储在堆栈内存中。当调用函数时,使用堆栈内存块并且其所有变量都存储在其中,因此当相同的函数返回时,释放先前使用的堆栈块。

因此您不应该访问从外部在函数中创建的变量,如果这样做,您将获得未定义的行为。

要解决此问题,您可以使用int* solve(int a0, int a1, int a2, int b0, int b1, int b2, int *result_size) { int r[2]; ... return r; } 在堆上分配内存,如下所示:

malloc

现在内存已在堆上分配,并且在函数结束时不会被清除。

不要忘记,当您不再需要时,应调用int* solve(int a0, int a1, int a2, int b0, int b1, int b2, int *result_size) { int *r = malloc(sizeof(r) * 2); ... 以释放相应的内存块。