2013-11-26 4 views
0

Я пытался попробовать некоторые демо-версии Codility для удовольствия, но я застрял в следующей простой проблеме с указателем (doh!). Мне было интересно, может ли кто-нибудь помочь мне?Проблема с вызовом Codility в C

Мой код:

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]

Я чувствую, что я что-то очевидное отсутствует. Может кто-нибудь пролить некоторый свет на это?

Спасибо заранее

ответ

2

counter массив находится в стеке, и поэтому «перестает существовать» (он же выходит из области видимости), когда функция возвращает. Счетчик в возвращенной структуре указывает на некоторое пространство в стеке, содержимое которого может измениться в любое время.

Есть много хороших описаний, которые углубляются в проблему.

+0

Ahh, я думал, что это будет что-то глупое с моей стороны! Это проблема с попытками этих поздних ночей. Это была согласованность возвращаемых значений, которые отбросили меня на правильный путь. Большое спасибо за помощь Джона. – user3038474

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

Уточните проблему, если вы ищете что-то конкретное.

0

Поместите свой массив вне решения функции, и он будет работать, потому что он глобальный. ;)

В противном случае массив исчезнет, ​​когда решение будет закончено.

Или вы можете просто объявить его статичным.

static int counter[100000]; 
Смежные вопросы