GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Strcpy (Linguagem C)


#1

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

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?


#2

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

Tente substituir a linha 14 por:

Arv *a = malloc(sizeof(struct arv));

#3

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.


#4

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

Arv *a = (struct arv *) malloc(sizeof(struct arv));

#5

Atente para:

typedef struct arv Arv;

#6

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


#7

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

#8

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


#9

Então,
para copiar os endereços bastava igualar, 'a->nome' passaria a utilizar o endereço de memória de 'nome':

a->nome = 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


#10

Agradeço pela ajuda! =]


#11