Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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);
}// 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"); 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"); 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"); 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]); free(m); w("\n"); return 0;
}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;
}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 --