Alocacao dinamica [RESOLVIDO]

1. Alocacao dinamica [RESOLVIDO]

Leonam Gama da Silva
leonamtotal90

(usa Ubuntu)

Enviado em 21/11/2009 - 17:44h

eu costumo usar o dev c++ para "programar"
nele a funcao malloc eu utilizo assim
ponteiro=malloc(sizeof(struct "nome da estrutura"))
mas no code blocks no windows mesmo e no gcc do linux tb essa operacao da um a erro de tipos alguem sabe disser por que?



  


2. Re: Alocacao dinamica [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/11/2009 - 20:02h

beba na fonte: C Language: Brian Kernighan, et al:

{{{
The question of the type declaration for a function like malloc is a vexing one for any
language that takes its type-checking seriously. In C, the proper method is to declare that
malloc returns a pointer to void, then explicitly coerce the pointer into the desired type with
a cast. malloc and related routines are declared in the standard header <stdlib.h>. Thus
talloc can be written as
#include <stdlib.h>
/* talloc: make a tnode */
struct tnode *talloc(void)
{
return (struct tnode *) malloc(sizeof(struct tnode));
}
}}}

Mais um detalhe, salvo engano esse seu compilador/IDE tem umas coisas diferentes do gcc... coisa fora do padrao ANSI se nao me engano, tipo o Borland Turbo C (desenterrei ne?)

[]s

PS> mais um exemplo:

{{{
struct nlist *lookup(char *);
char *strdup(char *);
/* install: put (name, defn) in hashtab */
struct nlist *install(char *name, char *defn)
{
struct nlist *np;
unsigned hashval;
if ((np = lookup(name)) == NULL) { /* not found */
np = (struct nlist *) malloc(sizeof(*np));
if (np == NULL || (np->name = strdup(name)) == NULL)
return NULL;
hashval = hash(name);
np->next = hashtab[hashval];
hashtab[hashval] = np;
} else /* already there */
free((void *) np->defn); /*free previous defn */
if ((np->defn = strdup(defn)) == NULL)
return NULL;
return np;
}

}}}


3. Re: Alocacao dinamica [RESOLVIDO]

Leonam Gama da Silva
leonamtotal90

(usa Ubuntu)

Enviado em 23/11/2009 - 16:09h

O Codigo fonte é o seguiNTE
UMA PARTE DELE.


struct reg *initlista(void)

{

return NULL;

}



void inserenoinicio(void)

{

struct reg *novono;



if(inicio==NULL)

{novono=malloc(sizeof(struct reg));

fflush(stdin);

printf("\nNovo elemento:");

gets(novono->nome);

inicio=novono;

novono->prox=NULL;}

else

{novono=malloc(sizeof(struct reg));

printf("\nNovo elemento:");

gets(novono->nome);

novono->prox=inicio;

inicio=novono;}

system("cls");

}






4. Erro de tipos

Leandro Santiago de Souza
leandro.diadema

(usa Slackware)

Enviado em 30/11/2009 - 15:33h

O que acontece é o seguinte:
a função "malloc" retorna um endereço para um ponteiro do tipo "void". Você declara um ponteiro do tipo da sua estrutura, e quando você faz isso:

ponteiro = malloc (sizeof (struct tal));

ele retorna erro pois espera que o seu ponteiro seja "void", devido a existirem diferentes tipos de compiladores, uns dão erros, outros não, para os que dão erros você pode usar um "casting" para o seu ponteiro receber sem poblemas o endereço retornado pelo "malloc":

ponteiro = (struct tal *) malloc (sizeof (struct tal));

Mais informações sobre type casting:
http://www.vivaolinux.com.br/dica/Operador-cast/






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts