我正试图通过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循环中,似乎我得到了引用对象的地址,但不是它的实际内容。我做错了什么?
答案 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);
...
以释放相应的内存块。