C中的Codility挑战问题

时间:2013-11-26 22:35:36

标签: c pointers

我一直在尝试一些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]

我觉得我错过了一些明显的东西。任何人都可以对此有所了解吗?

提前谢谢

3 个答案:

答案 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];