Jump to content

ajuda num codigo


RicardoLopes
 Share

Recommended Posts

Boas, estou a tentar passar todas as strings que tenho numa estrutura de dados (arvore AVL) para um array de strings, e estou a tentar fazer com que a inserção das strings seja de forma ordenada, mas esta me a dar segmentation fault, podem me ver e ajudarem me a compreender onde estou a falhar sff.

int length(char **s){
 int i=0;
 while(s[i]!=NULL) i++;
 return i;
}
char** swap(char **s,int a, int b){
 char *aux=s[a];
 s[a]=s[b];
 s[b]=aux;
 return s;
}
char** shiftr(char **s,int i){
 for(;i<length(s);i++){
   s=swap(s,i,i+1);
 }
 return s;
}
char** extractclient(Catcliente c,char **s){
 int meio,min=0,max=length(s)-1;
 if (c!=NULL){
   if (s==NULL){
  s=(char**)malloc(sizeof(char*));
  s[0]=strdup(c->string);
  s[1]=NULL;
  s=extractclient(c->e,s);
  s=extractclient(c->d,s);
   }
   else{
  while((max-min!=1)){
    meio=((length(s)-1)+min)/2;
    if(strcmp(s[meio],c->string)<0){
	  min=meio;
    }
    else{
	  max=meio;
    }
  }
  s=(char**)realloc(s,(length(s))*sizeof(char*));
  s=shiftr(s,max);
  s[max]=strdup(c->string);
  s[length(s)]=NULL;
  s=extractclient(c->e,s);
  s=extractclient(c->d,s);
   }
 }
 return s;
}
Link to comment
Share on other sites

quantoa memória está a ser reservada aqui ?

s=(char**)malloc(sizeof(char*));

Apenas um apontador para um caracter, mas eu estou a usar a função strdup que devolve um apontador de caracter, essa função por si propria não está já a reservar espaço na memoria para a string, penso eu

Edited by rdolxd
Link to comment
Share on other sites

agora que todos sabemos que só estás a reserver um ponteiro ...


s[0]=strdup(c->string); // 1
s[1]=NULL; // 2 ???
[/Code]

Estava a tentar arranjar alguma maneira de tentar saber o comprimento do array, foi um bocado forma estupida agora que penso nisso e desesperada pois estava a tentar fazer isto o mais depressa possivel. Lembrei me de experimentar agora a divisão de sizeof(s)/sizeof(char*) para saber o tamanho do array (visto que estou sempre a realocar mais 1) e retirei os NULLs. Ja não me dá segmentation fault, mas o programa tbm chega a parte que tem de chamar a função e está ali empancado, não haverá uma maneira mais eficiente de fazer isto?

Edit: burrice minha, já funciona, obrigado pela ajuda

Edited by rdolxd
Link to comment
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
 Share

×
×
  • 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.