TransWikia.com

Como iniciar um array com o valor que o usuario digitar é possivel?

Stack Overflow em Português Asked by silash35 on November 30, 2021

Se toda memória alocada é definida no momento da compilação, então como isto é possível:

int num{0};
cin >> num;
int array[num];

Pelo que eu entendi, isso só poderia ser possível se usar alocação dinâmica de memória.

One Answer

Primeiro, vamos combinar que esse array é estilo C e não C++.

Não sei o que quer dizer com "definida". Se isso quer dizer que está no código, sim, mas tudo está no código. Se está dizendo que a memória é alocada durante a compilação, não, isso seria impossível.

Talvez haja uma confusão de conceitos aí.

Existe da diferença entre tempo de compilação, que muitas vezes chamamos de estática, e tempo de execução que chamamos de dinâmica. A estática é definida em em tempo de compilação e não muda. Acho que é isso que está falando. Portanto se no código criar um com 10 elementos, ele não poderá ter qualquer coisa diferente disso. O código já sabe o valor. Mas a alocação dele só ocorre durante a execução, nem poderia ser diferente, então a alocação é dinâmica.

Bem, é possível ter a alocação em antecipada se estiver em área estática, o que não é o caso, ainda assim há uma alocação na carga do executável, a alocação não ocorre antes, só é mais simples e determinado antecipadamente.

Agora vamos usar os mesmos termos em outro contexto, apesar de muito próximo.

Quando você aloca memória no heap, e só nele (geralmente através do malloc()) chamamos de alocação dinâmica. A palavra dinâmica aqui não pode ser interpretada sozinha, estamos falando de alocação em área dinâmica. Ou seja, área que é gerenciada conforme a necessidade e o tempo de vida não é determinado.

Então o que não está no heap é estática? Não exatamente. Se é um dado que já vem no executável, a alocação é feita em área estática, ela já está lá pronta desde a compilação, carregou o executável, pode acessar. Geralmente não pode escrever lá.

Existe ainda uma área chamada de automática, que alguns acham que é estática, e não bem assim. Esta área é representada pela stack (tipicamente). A área toda da pilha é de fato é estática, é uma área que é reservada, e de certa forma podemos falar em alocação, durante a carga do executável, e de forma geral não muda durante toda execução do processo (ou da thread onde a alocação é feita na carga da thread).

Mas os dados que vão nela são alocados individualmente sob demanda do código de acordo com a execução do momento. Esta alocação não é estática. Podemos chamar de dinâmica? Até podemos, mas não da mesma forma que o heap, por isso que é chamada de automática, afinal o tempo de vida é determinado e você não precisa gerenciar manualmente.

Tanto a área dinâmica com a automática podem ter dados alocados conforme a necessidade, nesse sentido chamamos de dinâmica. Talvez deveria ter outro nome, sei lá, flexível, sob demanda, ou algo assim.

Então não tem algo de especial nisso. Você está alocando a área do vetor a ser alocada dentro da pilha no momento da execução.

Precisa entender o funcionamento da pilha para compreender todas implicações disto. No link acima tem informações sobre.

Declarar a variável só indica que vai usá-la e que precisará de um espaço para dados. Esse espaço pode ser determinado no momento anterior ao seu uso, a não ser se já estiver encrustado no executável.

Answered by Maniero on November 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP