Как мне работать с массивами int, объявленными с использованием malloc? - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть этот кусок кода:

// Returns the fibonacci range until the specified limit
int fibo(int** output, int limit)
{
    // Must be 1 or more
    if(limit < 1) return 0;

    int* range = (int*)malloc(sizeof(int) * limit);
    assert(range);

    int i;

    // Calculate the range
    for(i = 0; i < limit; i++)
    {
        int value;

        if(i == 0)  value = 0;
        if(i == 1)  value = 1;
        else        value = range[i - 2] + range[i - 1];

        range[i] = value;
    }

    *output = range;

    return 1;
}

Запуск с ограничением 15 выходов

65, 1, 66, 67, 133, 200, 333, 533, 866, 1399, 2265, 3664, 5929, 9593, 15522

что совсем не правильно. Я подозреваю, что это потому, что я пишу что-то вроде range[i - 2], когда я не должен этим заниматься. Я попытался использовать размер int в качестве перехода между каждым значением и получил ошибки сегментации. Я правильно использую []? Кто-нибудь может подумать о какой-либо другой причине, почему мой вывод странный?

Вот весь код программы

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Изменить

if(i == 1)  value = 1;

на

else if(i == 1)  value = 1;

РЕДАКТИРОВАТЬ: Только что понял, что уже был дан ответ в комментариях.

0 голосов
/ 06 сентября 2011

Вы пропускаете else между if (i==0) и if (i == 1), поэтому первый раз в обоих случаях 0 и 2+ запускаются.

0 голосов
/ 06 сентября 2011

Проблема с вашими ifs. У вас есть два утверждения if

if(i == 0)  value = 0;

и

if(i == 1)  value = 1;
  else        value = range[i - 2] + range[i - 1];

Если i равен 0, то второе значение if оценивается как диапазон [-2] + диапазон [-1], поэтому неопределенные данные из памяти

Вам нужно использовать else, чтобы это был всего один оператор if (также как точка стиля, всегда используйте {}, чтобы прояснить ситуацию)

if(i == 0) {  
   value = 0;
} else if(i == 1) {
   value = 1;
} else {
   value = range[i - 2] + range[i - 1];
}

В этом примере, вероятно, даже лучше установить диапазон [0] и [1] перед циклом и запустить цикл на 2, так что нет необходимости в if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...