我一直在尝试一些Codility演示问题以获得一些乐趣,但我仍然坚持以下简单的指针问题(doh!)。我想知道是否有人可以帮助我?
我的代码是:
struct Results solution(int N, int A[], int M) {
struct Results result;
N = 2;
const int N_const = N;
int counter[N_const];
counter[0] = 2;
counter[1] = 4;
result.C = counter;
result.L = 2;
return result;
}
结构定义为:
struct Results {
int * C;
int L;
};
然而,它返回:
返回值:[136343560,1]
不是我期待的[2,4]
现在,让我感到困惑的是,正如我所期望的那样,上面是一个指针问题,我的工作如下:
struct Results solution(int N, int A[], int M) {
struct Results result;
int counter[2];
counter[0] = 2;
counter[1] = 4;
result.C = counter;
result.L = 2;
return result;
}
正确回归:
返回值:[2,4]
但以下情况并非如此:
struct Results solution(int N, int A[], int M) {
struct Results result;
int counter[10000];
counter[0] = 2;
counter[1] = 4;
result.C = counter;
result.L = 2;
return result;
}
错误地返回:
返回值:[0,0]
我觉得我错过了一些明显的东西。任何人都可以对此有所了解吗?
提前谢谢
答案 0 :(得分:2)
counter
数组在堆栈上,因此当函数返回时它“停止存在”(也就是超出范围)。返回结构中的计数器指向堆栈中的某些空间,其中的内容可以随时更改。
有很多好的描述可以深入探讨这个问题。
答案 1 :(得分:0)
我对计数器和结构的使用感到困惑。
这是一种更新和返回结构数据的方法(这可以避免重复数据(内存优化))。
struct Results solution(int N, int A[], int M) {
struct Results result;
//here allocated length of 2 bytes (you can define variable for length and replace 2 with variable)
result.C =(int*)(malloc(2*sizeof(int)));
result.L = 2;
memset(result.C, 0, 2*sizeof(int));
//perform the operations and update directly result.C array.
//-or in this example case updating two bytes
result.C[0] = 2;
result.C[1] = 4;
result.L = 2;
return result;
}
如果您正在寻找特定的东西,请详细说明问题。
答案 2 :(得分:0)
将您的数组置于函数解决方案之外,它将起作用,因为它是全局的。 ;)
否则解决方案完成后数组将消失。
或者您可以将其声明为静态。
static int counter[100000];