Что произойдет, если на каждой итерации в al oop объявляется массив разного размера? - PullRequest
1 голос
/ 09 мая 2020

См. Следующую программу Я думаю, что это отличается от объявления переменных внутри l oop, потому что они занимают постоянное пространство, поэтому, как только они будут выделены, этого будет достаточно, но в случае массива размер массива является переменным (в приведенной ниже программе размер преднамеренно остается маленьким) что, если следующий размер повторно объявленного массива будет большим или из-за некоторой проблемы с размером, он будет повторно объявлять массив в каком-то другом месте?. Играя с ним, я заметил, что каждый повторно объявленный массив был построен путем расширения той же памяти ранее объявленного array. Есть ли вероятность, что он не может быть расширен для недавно объявленного массива?

#include<stdio.h>

int main(){
    int n = 5; 
    while(5){
        int a[n];
        for(int i = 0; i < n ; ++i){
            a[i] = 0;
        }
        f[n--] = a;  
        if(n == 0){
            break;
        }
    }

Итак, здесь Array a [n] объявляется несколько раз разных размеров,

  • Что происходит с предыдущим объявлением?

Пожалуйста, объясните, что происходит в этой программе, почему она выводит ноль в качестве содержимого?

#include<stdio.h> 
int* f[10]; 
int main(void) { 
    int n = 5; 
    while(5){ 
        int a[n]; 
        for(int i = 0; i < n ; ++i){ 
            a[i] = 5; 
        } 
        f[n--] = a; 
        if(n == 0) break; 
    } 
    printf("\ndone\n"); 

    while(++n < 5){ 
        for(int i = 0; i < n; ++i){ 
            printf("\nat size = %-3d : base address = %-7d : a[%d] = %-4d at" 
                   "address = %-7d ", n , f[n],i, *(f[n]+i), (f[n]+i)); 
        } 
        printf("\n\n"); 
    } 
    return 0; 
}

1 Ответ

3 голосов
/ 09 мая 2020

Теоретически переменные, объявленные внутри области видимости (l oop, if / else, функция, переключатель), уничтожаются / создаются при достижении конца области видимости или при запуске.

На практике код, сгенерированный компилятором, заставит функцию повторно использовать ту же область памяти для переменной l oop. Таким образом, вы могли видеть остатки предыдущих l oop итераций, но вы не должны полагаться на них, просто память не стирается.

Итак, когда переменная объявляется внутри области ({ }), считается, что это новая переменная при достижении начала области видимости (т. Е. Ей необходимо присвоить значение внутри области перед чтением). Но доверьте компилятору оптимизацию «создания / уничтожения» переменной, так как он просто повторно использует память переменных из других областей действия / итераций, которые больше не доступны.

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