cake
Março 17, 2011, 1:25pm
#1
[code]typedef struct arv Arv;
struct arv
{
char *nome;
char *fone;
char *mail;
Arv *esq;
Arv *dir;
};
Arv* cria(char *nome, char *fone, char *mail)
{
Arv *a = malloc(sizeof(Arv));
strcpy(a->nome, nome);
strcpy(a->fone, fone);
strcpy(a->mail, mail);
return a;
}
int main()
{
char *nome = “cake”;
char *fone = “1”;
char *mail = "cake@mail.com ";
Arv *b = cria(nome, fone, mail);
}[/code]
O código acima dá erro.
Funciona quando eu comento a seguinte linha:
Arv* cria(char *nome, char *fone, char *mail)
{
Arv *a = malloc(sizeof(Arv));
strcpy(a->nome, nome);
strcpy(a->fone, fone);
//strcpy(a->mail, mail);
return a;
}
Alguém manja o que está acontecendo?
Suspeito que sizeof(Arv) não seja a mesma coisa que sizeof(struct arv).
Tente substituir a linha 14 por:
Bah, acho que me enganei. Olhei muito rápido seu código e deduzi que você tinha declarado Arv como um ponteiro para a estrutura arv.
Bom, outra coisa que você pode tentar é realizar uma coerção no momento da alocação de memória:
O strcpy copia o conteúdo do pointer, e no caso a sua estrutura só tem o pointer, sem alocar memória para que caiba seu conteúdo.
Os dois primeiros devem ter passado porque o número de bytes envolvidos é pequeno (“1” são 2 bytes e “cake” são 5). Já no terceiro estoura o espaço e sobrepoe algum espaço relevante da memória.
Então, você precisa fazer um malloc para cada um dos campos com o espaço necessário, sempre considerando +1 devido ao ‘0’ no final dos arrays de char.
Blz
Complementando, ficaria algo assim:
[code]Arv* cria(char *nome, char *fone, char *mail)
{
Arv *a = malloc(sizeof(Arv));
a->nome = malloc(strlen(nome)+1);
a->fone = malloc(strlen(fone)+1);
a->mail = malloc(strlen(mail)+1);
strcpy(a->nome, nome);
strcpy(a->fone, fone);
strcpy(a->mail, mail);
return a;
}[/code]
cake
Março 17, 2011, 3:56pm
#8
A memória já está alocada…
O strcpy só copia os endereços de um pointer pra outro, estou errado?
Então,
para copiar os endereços bastava igualar, ‘a->nome’ passaria a utilizar o endereço de memória de ‘nome’:
O strcpy copia arrays terminados em zero de um endereço para o outro
Aqui tem uma explicação boa e o fonte do strcpy:
http://en.wikipedia.org/wiki/Strcpy