Condividi:        

errore di segmentazione in C

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

errore di segmentazione in C

Postdi topwild » 21/01/08 17:33

questo è il programma
Codice: Seleziona tutto
#include<stdio.h>
#include<stdlib.h>

 int main()
   {int n = 10, i;
    int*v;
    long * pt;
    long * nMax;
   
   
    long*IndMax(const int v[],long n,long*nMax);
   
      v =(int*)malloc(n*sizeof(int));
      printf("inserire valori per riempire il vettore");
      for(i = 0; i < n ; i++){
            scanf("%d", v[i]);
           
      }
       pt = IndMax( v, n, nMax);
       printf("%d%ld", pt, nMax);
       
    }

    long*IndMax(const int v[],long n,long*nMax)
   
    {int i , j = 0, mag;
     long *t;
     
        mag = v[0];
        for(i = 1; i < n; i++){
              if(v[i] > mag){
                      mag = v[i];
              }
        }
        *nMax = 0;
        for(i = 0; i < n; i++){
              if(mag == v[i]){
                     *nMax++;
                     
                      t = (long*)realloc(t,*nMax*sizeof(long));
                     t[j] = i;
                     j++;
              }
        }
        return t;
      }
non mi da errori di sintassi ,ma non riesco a capire dove sbaglio
io
topwild
Utente Junior
 
Post: 27
Iscritto il: 08/12/03 15:23

Sponsor
 

Re: errore di segmentazione in C

Postdi topwild » 21/01/08 19:17

un altra cosa: sei io ho un vettore di puntatori e devo scambiare gli indirizzi come faccio?
grazie

Moderazione: rimosso quote non necessario.
io
topwild
Utente Junior
 
Post: 27
Iscritto il: 08/12/03 15:23

Re: errore di segmentazione in C

Postdi zello » 22/01/08 11:23

Non ho controllato neppure a cosa serve il codice, però:
Codice: Seleziona tutto
*nMax = 0;

Bang. nMax è dichiarato puntatore a long, e mai allocato.
Così, a occhio, allochi memoria per un vettore che non liberi mai; inoltre non ritorni un int da main (non so se in C è obbligatorio, mi pareva di sì; in c++ non lo è). Inoltre fai vari realloc su t senza averlo mai allocato, e non ne liberi mai la memoria. Il cast sul risultato di malloc-realloc non serve in c (serve in c++).
un altra cosa: sei io ho un vettore di puntatori e devo scambiare gli indirizzi come faccio?

Non ho capito. Se hai una situazione di vettori a puntatore di - che so io - interi, basta swapparli:
Codice: Seleziona tutto
int* p[n];
int* q[n];
int* tmp; tmp=p[0]; p[0]=q[0]; q[0]=tmp;

(ci sono modi più furbi, senza la variabile temporanea di appoggio, ma non sono portabili)
Se invece intendi che hai una situazione nel quale vuoi che p punti al vettore precedentemente puntato da q, semplicemente non puoi farlo, perché gli array sono lvalue *non* modificabili. L'unica è dichiarare come puntatori
Codice: Seleziona tutto
int** p=malloc(n*sizeof(int*))
int** q=malloc(n*sizeof(int*));
int** tmp; tmp=p;p=q;q=tmp;

Se l'array è il parametro di una funzione, in realtà viene trattato come un puntatore (dichiarare void f(char a[]) e void f(char* a) è *perfettamente* equivalente), e quindi te lo lascia fare:
Codice: Seleziona tutto
void swap(int* a[], int* b[])
{
    int** tmp=a; a=b; b=tmp;
}
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44


Torna a Programmazione


Topic correlati a "errore di segmentazione in C":


Chi c’è in linea

Visitano il forum: Nessuno e 21 ospiti