Strcpy (Linguagem C)

9 respostas
C
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 = "[email removido]";
  Arv *b = cria(nome, fone, mail);
}
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?

9 Respostas

tnaires

Suspeito que sizeof(Arv) não seja a mesma coisa que sizeof(struct arv).

Tente substituir a linha 14 por:

tnaires

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.

tnaires

Bom, outra coisa que você pode tentar é realizar uma coerção no momento da alocação de memória:

C

Atente para:

jamirdeajr

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

jamirdeajr

Complementando, ficaria algo assim:

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;
}
C

A memória já está alocada…
O strcpy só copia os endereços de um pointer pra outro, estou errado?

jamirdeajr

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

C

Agradeço pela ajuda! =]

Criado 17 de março de 2011
Ultima resposta 18 de mar. de 2011
Respostas 9
Participantes 3