Ir para conteúdo

POWERED BY:

Arquivado

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

cooler_

[Resolvido] [Tutorial] Alocação de memoria dinâm

Recommended Posts

Como vai leitores ,Hoje resolvi passar algo diferente num “post” com um assunto mais Geek

seria “alocação dinâmica de memória em C”,vamos usar “stdlib” que seria uma biblioteca para tal fim só

foi possível fazer esta dica graças ao Livro “C ansi” do “K&R“.

 

Vamos á Dica

Para funções de alocação de memória em C vamos usar seguintes funções da Biblioteca “stdlib.h”

“calloc”,”malloc” e “realloc”.Outra função desta mesma “Lib” que vamos usar vai ser “rand” que

nos retorna um numero randômico para nosso teste.

 

o “calloc” retorna um apontador para um espaço de um vetor,o espaço é inicializado por zero bytes

 

o “malloc” retorna um apontado para espaço de um objeto por um tamanho indicado.

 

o “realloc” altera tamanho do objeto apontado para “p”.

 

exemplo para ver memoria alocada

#include <stdio.h>
#include <stdlib.h>
main() {
    int Mb = 0;
    while ( malloc(1<<20)) ++Mb;
    printf("Allocated %d MB total\n", Mb);
}

Vou passar um programa que tenha o uso das 3 funções em linhas comentadas …

 

// Autor: Cooler
// Exemplo de alocação dinâmica usando vetores
// Site:httṕ://BotecoUnix.com.br
// Biblioteca padrão de entrada e saida
#include <stdio.h>
// Biblioteca para alocação de memória e outras tarefas
#include <stdlib.h>
 
#define w printf
 
int main(int argc, char *argv[]) {
 int i,*v,*m;
 
 w("vetor iniciando usando calloc\n");
// alocamos na memoria no vetor "v" 5 blocos sendo "int"
// repare o uso do "sizeof" ele produz o número de bytes
// exigidos para armazenar em um objeto do tipo do seu operando
 v=(int *)calloc(5,sizeof(int));
// atribuimos valores qualquer usando função rand
 for(i=0; i<5; i++) v[i]=rand()%100;
 for(i=0; i<5; i++) w("%3d",v[i]);
 
 w("\nvetor ficando maior usando realloc\n");
// agora alteramos o tamanho da memoria alocada para dez
// inves de "5" usando funçao realloc
 v=(int *)realloc(v,10*sizeof(int));
 for(i=5; i<10; i++) v[i]=rand()%100;
 for(i=0; i<10; i++) w("%3d",v[i]);
 
 printf("\nvetor deixando menor usando realloc\n");
//aqui deixamos de 10 para 3 valor de blocos do vetor
 v=(int *)realloc(v,3*sizeof(int));
 for(i=0; i<3; i++) w("%3d",v[i]);
 
//agora vamos usar malloc
 w("\nAgora iniciando um vetor com malloc\n");
 m=(int*)malloc(sizeof(int)*10);
 for(i=0; i<10; i++) m[i]=rand()%100;
 for(i=0; i<10; i++) w("%3d",m[i]);
// mostrando o endereço alocado por "m"
 w("\nEndereço de 'm' é : %p \n", m);
//liberamos area alocada pelo malloc com a função "free"
  free(m); w("\n"); return 0;
}

bem e agora mostrando como você poderia usar isso vou

passar um problema e a solução…

 

//autor: Cooler_
// bOTECOuNIX.cOM.bR
//#############################################################################
// Problema Hospital
// um hospital deseja cadastrar os seguintes nomes dados sobre as pessoas
// atendidas nome,idade,peso e altura defina uma estrutura de dados conveniente
// para armazenar estes dados,considere que o cadastro será armazenado num vetor.
// O tamanho do vetor deve ser definido dinamicamente
 
#include <stdio.h>
#include <string.h>
#include  <stdlib.h>
 
#define w printf
#define MAX 21
 
typedef struct pessoa {
 char nome[MAX];
 int idade;
 float peso, altura;
} pessoa;
 
pessoa nova_pessoa() {
 int i;
 pessoa p;
 
 w("o Nome: \n");
 getchar(); fgets(p.nome, MAX, stdin);
 i = strlen(p.nome)-1;
 if(p.nome[i] == '\n') { p.nome[i] = '\0'; }
 w("A idade:\n"); scanf("%d",&(p.idade));
 w("O peso:\n"); scanf("%f",&(p.peso));
 w("A altura:\n"); scanf("%f",&(p.altura));
 return p;
}
 
int main(int args, char * arg[]) {
 int i,n;
 pessoa *cad;
 
 w("numero de pessoas\n"); scanf("%d", &n);
 cad=(pessoa *)calloc(n,sizeof(pessoa));
 for(i=0; i<n; i++) { w("\nPessoa %d",i+1); cad[i]=nova_pessoa(); }
 w("cadastro atual\n"); w("Nome         Idade  Peso         Altura\n");
 for(i=0; i<n; i++) w("%s    %5d    %5.1f       %7.2f\n",cad[i].nome,cad[i].idade,cad[i].peso,cad[i].altura);
 w("\n"); return 0;
}

também tem uma dica do fox que era assim

strdup (string);

O que essa funcao faz eh basicamente alocar espaco na memoria referente a 
string  e  depois  retorna um  ponteiro para,  a, dita, cuja. Essa funcao 
faz a mesma coisa que o malloc(), soh que, ao invez de  alocarmos memoria 
com o malloc() e depois usarmos funcoes auxiliares  para copia  de dados, 
nos usamos o strdup() q ja aloca e copia tudo de um vez daí ;) Com strdup 
-- cut -- 

main (){

  char *pointer;
  pointer= strdup ("Hail Silver! OO Ou algo assim \\O/");  /* Retorna a string 
devidamente alocada daí ;) */

  puts (pointer);         // Imprime a string na tela
  free (pointer);         // Libera a memoria alocada (Na heap)
}

-- cut --

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.