Jump to content
Patrone

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

Recommended Posts

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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Edited by 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."

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.