Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Angeline Melchiors

C Função char* precisa retornar char (e não endereço)

Recommended Posts

Olá!

Preciso, para um exercício de aula, escrever uma função com protótipo

char* separa(int numero)

e essa função deve retornar um char.

Porém ela retorna um endereço!

Imagino que seja por causa do * após char. 

Não posso mudar o protótipo, ele precisa ficar exatamente assim, e a avaliação é pelo return da função, não posso converter no main.

Como faço para que o retorno seja um char?

 

Grata.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aloca memória dinamicamente, e retorna o endereço da memória alocada:

char* separa(int numero) {
    char *r = malloc(sizeof *r);
    *r = 'a';
    return r;
}

 

E onde chama a função:

char *c;
c = separa(0);

/*Usa o caractere retornado*/
printf("%c\n", *c);

//libera a memória alocada dinamicamente
//quando não precisar mais dela:
free(c); 

 

Mas fazer isso me parece uma complicação desnecessária de algo que deveria ser mais simples, se vai retornar apenas 1 char então deve retornar como char diretamente. Normalmente se retorna ponteiro de char quando o objetivo é retornar o endereço de um vetor de chars que foi alocado dinamicamente, não um único char, então talvez o exercício pede que seja retornado mais do que um único char?

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, esse ponteiro também faz parte do protótipo e você tem que permanecer com ele ai, e retorna um char (1 byte). O caso é que, com esse ponteiro sendo retornado você não só está retornando um char, mais sim muitos, o que contradiz o próprio enunciado do problema.

 

 

 
char * separa (int numero);

int main (int argc, char **argv){
    putchar ((int) separa(1));
    printf ("] Letra: %c", ((int) separa(1)));
    return  0; }


char * separa (int numero){ return  (char*) 'A'; }

Isso está certo porque todo ponteiro precisa de mais que 1 byte para existir (pois é também uma variável int), o que fiz foi modificar a natureza dessa memória existencial que prova ser mais de um char, ou seja, essa questão é "distorção de conceitos".

 

Alguém duvida?

Editado por AnsiC
melhorar a mensagem
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiCe @isrnick vocês estão certos, na verdade é um vetor de caracteres.

Achei que ficava mais fácil de explicar considerando um único char.

Tentei adaptar as duas soluções para vetor, mas não fui capaz.

Agradeço se puderem me ajudar novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como propôs por @isrnick ! Veja outros exemplos:

 

Ex.1: ingenua

#include  <stdlib.h> /**< malloc. Para reservar a memória. */
char * separa (int n){ return  malloc (sizeof(char) * n); }

 

Ex.2: pouco ingenua

#include  <stdlib.h> /**< malloc, exit, EXIT_FAILURE */
#include  <errno.h>  /**< errno, EINVAL */
char * separa (int n){
    if (0  <  n){
          char *r = calloc (1, sizeof(char[n]));
          if (NULL  !=  r){ return  r; }
          perror ("<!> Houve erro ao alocar memória.\a"); }
    else{
          errno = EINVAL;
          perror ("<!> Houve erro no parâmetro 1.\a"); }
  
    puts (__FUNCTION__);
    exit (EXIT_FAILURE);
  
    return  NULL; }

 

Alguma pergunta?

Editado por AnsiC
melhorar a mensagem
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na função:

char* separa(int numero) {
    char *r; //Ponteiro
    r = malloc(100 * sizeof *r); //aloca um vetor de 100 chars
    strcpy(r, "abcdef"); //guarda a string "abcdef" no vetor apontado pelo ponteiro r
    return r; //Retorna a referência para o vetor
}

Onde a função é chamada:

char *s; //Ponteiro
s = separa(0); //A função retorna um endereço de memória para o vetor de chars

/*Imprime a string armazenada no vetor de chars*/
printf("%s\n", s);

//libera a memória alocada dinamicamente
//quando não precisar mais dela:
free(s); 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada!!

Consegui, mas usando calloc no lugar de malloc.

Só não sei o que realmente aconteceu, mas funcionou! :thumbsup:

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×