Strcpy (Linguagem C)

[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:

Atente para:

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]

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

Agradeço pela ajuda! =]