Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Patrone

Tipo de retorno de função: apontador ou não?

Mensagens Recomendadas

Patrone

Boas, aproveito este tópico para fazer uma pergunta relacionada com funções.

Há uma coisa que me faz confusão, quando se deve usar o * no cabeçalho da função?

Por exemplo, qual destes está correto? Uma vez que lidam as duas com pointers.

int strlenght(char *s){
   if(*s=='\0')
       return 0;
   return 1+strlenght(++s);
}

int * strlenght(char *s){
   if(*s=='\0')
       return 0;
   return 1+strlenght(++s);
}

Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Normalmente não é boa ideia retornares o endereço de conteúdo definido dentro da função, visto poder não estar acessível de fora

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Patrone

Rui Carlos, neste caso queria retornar um inteiro. É uma função para contar carateres de uma string usando recursividade

nelsonr, é isso que me faz confusão. A memória de uma função não é completamente eliminada quando a função termina? Em que sintuação é que faz sentido fazer return de um apontador?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax
A memória de uma função não é completamente eliminada quando a função termina?

A memoria da Stack e' automaticamente eleminada quando sais do scope. --trocando por miudos: quando a funcao termina TUDO que foi alocado sem ser com malloc e' apagado.--

Em que sintuação é que faz sentido fazer return de um apontador?

Tantas...

#include<stdio.h>
#include<string.h>

char* Juntar(char* str1,char* str2)
{
 int sz = strlen(str1)+strlen(str2)+1;
 char* ss = malloc(sz);
 memcpy(ss,str1,strlen(str1));
 memcpy(ss+strlen(str1),str2,strlen(str2)+1);
 //*(ss+sz+1)='\0'; //ja' e' copiado no memcpy 
 return ss;
}


char* stackJuntar(char* str1,char* str2)
{
 int sz = strlen(str1)+strlen(str2)+1;
 char ss[250]; //espero que nao se mande arrays com muitos caracteres 
 memcpy(ss,str1,strlen(str1));
 memcpy(ss+strlen(str1),str2,strlen(str2)+1);
 //*(ss+sz+1)='\0'; //ja' e' copiado no memcpy 
 return ss;
}

int main()
{
   printf("%s",Juntar("Koizo","Xenx")); //imprime "KoizoXenx"
   printf("%s",stackJuntar("Xenx","Marados")); //nao deveria de imprimir NADA!
}


EDIT: Meter o exemplo da stack e ajustar o codigo.

Editado por pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Rui Carlos, neste caso queria retornar um inteiro. É uma função para contar carateres de uma string usando recursividade

Se queres devolver um inteiro, então o tipo de retorno deve ser int.

nelsonr, é isso que me faz confusão. A memória de uma função não é completamente eliminada quando a função termina? Em que sintuação é que faz sentido fazer return de um apontador?

Um exemplo simples:

char* substring(char* str, int n) {
 return str + n;
}

Há várias situações em que faz sentido devolver um apontador, e em que podes fazê-lo de forma segura. Neste caso podes devolver o apontador pois a string foi alocada fora da função. Também podes fazê-lo quando usas uma função da família *alloc, por exemplo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.