cooler_ 0 Denunciar post Postado Fevereiro 16, 2010 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