Ir ao conteúdo
  • Cadastre-se

Alocação Dinâmica


italobrenun

Posts recomendados

Olá galera, estou estudando alocação dinâmica e não consigo entender essa função


vet=(int *)malloc(sizeof(int)*tam);

Vou falar o que eu entendi até agora:

Observei que quando usa a alocação dinâmica o ponteiro "vira" um vetor:eek:

aqui está o código que estava estudando


#include <stdio.h>
#include <stdlib.h>



void aloca (int tam)
{
int *vet;
int i;
vet=(int *)malloc(sizeof(int)*tam);

for (i=0; i<tam; i++)
{
printf("Informe o valor: ");
scanf("%d",&vet[i]);
}



for ( i=0; i<tam; i++)
printf("\n no valor é: %d",vet[i]);

}

int main(int argc, char *argv[])
{



// testando sizeof
/*
int a;
int b;

;


a=sizeof (char);

printf("%d",a);
*/

system("color 4f");


int tam;


printf("Informe o tamanho do Vetor");
scanf("%d",&tam);

aloca(tam);




system("PAUSE");
return 0;
}

vejo que lá na main eu coloquei um printf para saber quantas posições ele queria em um "vetor" (que na verdade é um ponteiro), na função eu consigo entender isso: parece que ele pegou o tamanho da variável TAM, que é 4 o número de byte que cada byte seria uma posição do novo vetor e multiplicou pelo valor da variável tam, é isso mesmo?

eu não consigo identificar isso no seguinte código:


vet=(int *)malloc(sizeof(int)*tam);

vejo um bocado de parêntese aí, se alguem popder me explicar passo-a-passo isso eu agradeço muito mesmo

até logo

obrigado pela atenção

a esse negocio de reservar memória quando eu termino o programa essa memória reservada volta pro meu disco rígido certo?

Link para o comentário
Compartilhar em outros sites

Na verdade, um ponteiro é um vetor. Por exemplo:

int vet[10];

Se você olhar o tipo de vet de alguma forma, verá que é um const int *, ou seja, um ponteiro para um endereço constante de inteiro.

Um vetor é, internamente, um conjunto das três seguinte coisas:

- Um endereço de memória (um ponteiro);

- Um tipo de dado (o tipo dos elementos do vetor);

- Um tamanho, representado por um inteiro.

Logo, você perceberá que um vetor é um ponteiro para algum lugar da memória. Nesse lugar, estão alocados n espaços (tamanho do vetor) de s bytes (quantidade de bytes correspondente ao tipo).

Sobre a função malloc, ela recebe como parâmetro a quantidade de bytes que deverá ser alocada. Seu tipo de retorno é um ponteiro para void, ou seja, apenas um endereço de memória. No seu exemplo:

vet=(int *)malloc(sizeof(int)*tam);

O programa está pedindo para a função malloc alocar uma quantidade de bytes correspondente a tam vezes o tamanho de um int. Por exemplo, se tam fosse 10 e o tamanho de um int fosse 32 bits (4 bytes), estariam sendo alocados 40 bytes em um lugar específico da memória. O endereço desse lugar é retornado pela função como um ponteiro para void, e tem que ser convertido para o tipo de vet para realizar a atribuição. Logo, após a atribuição a variável vet está apontando para um espaço de 40 bytes contíguos, suficiente para armazenar 10 inteiros.

a esse negocio de reservar memória quando eu termino o programa essa memória reservada volta pro meu disco rígido certo?

Quando nos referimos a alocação de memória, estamos normalmente nos referindo à memória principal e não à memória secundária. A memória principal é a utilizada para carregar e executar os programas, a qual é comum se referir como memória RAM. A memória secundária é a memória persistente, a qual é comum se referir como memória ROM.

Espero ter ajudado.

ZaZ

Link para o comentário
Compartilhar em outros sites

Valeu Valeu amigo...

Agora se não for pedir muito...

agora deixa eu ver se eu entendi:

no trecho:

(int *)= tipo

sizeof(int)*tam)= seria o tamanho do tam por exemplo 5 vezes int que é 4 que seria um vetor de 20 bytes contendo 5 espaços de 4 bytes cada certo?

você pode me ensinar a calloc?

obrigado pela resposta e pela atenção

Boa noite

Link para o comentário
Compartilhar em outros sites

Um tipo entre parênteses significa uma conversão de tipos. Por exemplo:

char c = 'c';
printf("%d", (int)c);

O código acima imprimiria o valor da conversão do caractere 'c' para o tipo inteiro, no caso seu valor correspondente na tabela ASCII.

A função calloc funciona de maneira análoga à malloc, com a diferença de, ao invés alocar um grande bloco de memória, aloca blocos sequenciais. Por exemplo:

vet1 = (int*)malloc(tam * sizeof(int));
vet2 = (int*)calloc(tam, sizeof(int));

No código acima, vet1 e vet2 alocaram dois espaços de memória contíguos, de mesmo tamanho. A diferença básica entre eles é que vet2 tem todos seus bits inicializados em 0.

Note que calloc possui dois argumentos, um referente ao número de espaços contíguos a serem alocados, e outro referente ao tamanho desses espaços.

Espero ter ajudado.

ZaZ

Após aproximadamente três segundos realizando uma busca no Youtube eu achei essa video aula:

Link para o comentário
Compartilhar em outros sites

Na verdade, um ponteiro é um vetor.

(...)

Não mesmo.

Um ponteiro é simplesmente um endereço de memória...

Vetor é só uma abstração conceitual/teórica que é posta em prática utilizando-se trechos contínuos de memória de tal forma que se possa utilizar a notação de "posição" do elemento, afinal, escrever vetor é o mesmo que fazer *(vetor+i) o que torna fácil tratar "vetores"...

-

Link para o comentário
Compartilhar em outros sites

Eu escrevi ao contrário, o certo seria "um vetor é um ponteiro". Se você olhar a sentença abaixo, verá que está explicando que um vetor é um ponteiro.

Obrigado por notar minha desatenção, pois poderia confundir alguém.

Vetor é só uma abstração conceitual/teórica que é posta em prática utilizando-se trechos contínuos de memória de tal forma que se possa utilizar a notação de "posição" do elemento, afinal, escrever vetor é o mesmo que fazer *(vetor+i) o que torna fácil tratar "vetores"...-

Acho que você está olhando as coisas do ponto de vista do programador. Vetores não são implementados em espaços contíguos para facilitar a programação, mas para que o acesso ao dado tenha complexidade constante (O(1)). Se o vetor não fosse implementado desta maneira, localizar um elemento nele teria complexidade linear (O(n)), pois seria uma lista ligada. Além disso, essa implementação não gasta memória com ponteiros para as próximas posições.

ZaZ

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!