2012-04-11 2 views
3

Я задал предыдущий вопрос об объявлении массива в цикле for, например.Array in for loop, C99

for(i=0;i<=1000;i++){ 
    float arrayone[(length[i])]; 
    do a bunch of other stuff 
} 

В принципе, я пытаюсь сделать массив, длина которого может варьироваться в зависимости от того, на каком этапе находится программа. Я не хочу, чтобы данные массива сохранялись постоянно (например, arrayone [] []), так как он большой, и есть много шагов.

Так что мне сказали, что законно объявлять массив только в этой области, как это. Но попытается ли он хранить 1000 копий массива к концу, чего я не хочу? Я новичок, поэтому я не понимаю нюансов того, что действительно делают блоки.

Альтернатива для меня состоит в том, чтобы сделать массив вне цикла, который имеет максимальную длину, когда-либо необходимо, и перезаписать это на каждом шагу.

Редактировать: Использование для массива: у меня есть глобальный массив. Массивы в цикле заполняются результатами функции с использованием этого глобального массива, чтобы экономить вычисления. Массивы обрабатываются, ..., ... и, наконец, используются для изменения глобального массива. Тогда они больше не нужны.

+3

Перейти к альтернативным решениям – ControlAltDel

+1

Вы действительно задали вопрос? Я его не вижу. – abelenky

+0

Было бы неплохо поделиться тем, что делает массив, возможно, есть лучший способ сделать это, чем это. –

ответ

7

Но попытается ли он хранить 1000 копий массива к концу, чего я не хочу?

Нет, в начале каждой итерации новый массив будет выделен, и, так как массив выходит из области видимости в конце итерации, в то время он будет освобождаться, поэтому только один массив существует в одно время.

Это точка автоматических переменных (что такое массив). В конце области, в которой они объявлены (обычно, но не всегда ограничены фигурными скобками), они автоматически освобождаются.

+0

Спасибо! Я думаю, это все, что мне нужно знать. – user1313527

+0

@ user1313527: Тогда вы должны принять ответ. –

0

После каждой итерации вашей петли все переменные, которые были объявлены внутри вашего цикла, будут уничтожены, включая ваш массив. Таким образом, будет сохранена только одна копия вашего массива.

При этом, однако, вы должны знать, что инициализация массива вне вашего цикла, вероятно, лучше, потому что вам не нужно выделять память в стеке каждую итерацию.

Если вы динамически выделять ваш массив (который вы не в вашем примере), как это:

for(i=0;i<=1000;i++){ 
     float * arrayone = (float*)malloc(i * sizeof(float)); 
    } 

то у вас есть проблемы. Здесь локальная переменная - это указатель, который, когда он уничтожается, больше не может получить доступ к выделенной памяти. Это тот случай, когда вы сразу же получите 1000 различных массивов в памяти. Вы могли бы free вашей памяти до того, как указатель будет уничтожен, но я утверждаю, что наличие массива, объявленного вне цикла, еще лучше.

+0

Выделение памяти в стеке очень дешево, и если вы выделяете его за пределы цикла, то вам нужно добавить сложность нахождения наибольшего числа в массиве, если это еще не известно. –

+0

@Seth Если вы обнаруживаете наибольшее число в массиве, вы имеете в виду определение размера массива, который не добавлен в сложность, так как вы должны знать размер массива для его создания. Все остальное точно совпадает с тем, объявили ли вы массив внутри цикла или снаружи. Что же касается дешевизны, то насколько дешевле она тогда не выделяет память на каждую итерацию? – SirGuy

+0

Нет, я имею в виду, что вам нужно найти наибольшее число, которое имеет значение 'length', потому что вам понадобится массив размером наибольшего числа в массиве' length', чтобы вы могли создать массив, достаточно большой для охвата любой массив, который вы создали бы внутри цикла (обратите внимание, что длина каждого массива вычисляется как 'length [i]'). Кроме того, выделение памяти в стеке обычно является одной командой сборки. –