Ir ao conteúdo
  • Cadastre-se

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


a.melchiors

Posts recomendados

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
Link para o comentário
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
Link para o comentário
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?

  • Curtir 2
Link para o comentário
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?

  • Curtir 2
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...