Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15

Discussione: [C]Problema uso malloc

  1. #11
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Sono di nuovo nei guai ho scritto un' altro programma che crasha (il compilatore non segnala errori ne warnings).
    Ecco il codice:
    codice:
    main()
    {
        int *a,i,copia;
        a=(int*)malloc(sizeof(int));
        for(i=1;*a!=-999;a++,i++)
        {
            a=(int*)realloc(a,i*sizeof(int));
            scanf("%d",a);
        }
    }
    Il programma dovrebbe ricevere dei valori da inserire nell' array allocato dinamicamente,e smettere di ricevere i valori quando si digita -999.
    Digito il primo e il secondo valore,poi crasha.Anche se digito -999 non si ferma.
    La scanf dovrebbe accettare a che è un indirizzo,ho provato anche con &a[i-1] all' interno della scanf ma niente da fare,crasha sempre.
    Cosa c'è che non va?

  2. #12
    Originariamente inviato da ramy89
    Sono di nuovo nei guai ho scritto un' altro programma che crasha (il compilatore non segnala errori ne warnings).
    Ecco il codice:
    codice:
    main()
    {
        int *a,i,copia;
        a=(int*)malloc(sizeof(int));
        for(i=1;*a!=-999;a++,i++)
        {
            a=(int*)realloc(a,i*sizeof(int));
            scanf("%d",a);
        }
    }
    Il programma dovrebbe ricevere dei valori da inserire nell' array allocato dinamicamente,e smettere di ricevere i valori quando si digita -999.
    Digito il primo e il secondo valore,poi crasha.Anche se digito -999 non si ferma.
    La scanf dovrebbe accettare a che è un indirizzo,ho provato anche con &a[i-1] all' interno della scanf ma niente da fare,crasha sempre.
    Cosa c'è che non va?
    pessimo modo di usare un ciclo for
    la condizione di uscita dovrebbe sempre essere legata alla variabile di iterazione E eventualmente anche ad una interna

    in ogni caso gli stai dicendo, primo ciclo per esempio:
    prendi il vettore a e reallocalo di dimensione 1*int
    inserisci l'elemento
    incrementa il puntatore di a
    verifica se a+1 == 999 ERRORE, a+1 è fuori dalle dimensioni del vettore che a questo ciclo è di dimensione 1! -> segmentation failure

    codice:
    int main()
    {
        	int *a,i = 1, temp;
    	int finito = 0;
    	   
    	a=(int*)malloc(sizeof(int));
    
    	while(!finito){
    		scanf("%d", &temp);
    		if(temp == 999)
    			finito=1;
    		else{
    			*a = temp;
    			a= (int*) realloc(a, (i+1)*sizeof(int));
    			i++;
    		}
    	}
    
    	return 0;
    }

  3. #13
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ok....alla fine del tuo codice se scrivo:
    codice:
    printf("%d",*a);
    Mi stampa l' ultimo valore che ho immesso.
    Posso stampare tutto l' array citando gli elementi a[0],a[1],...ecc...
    Ma se volessi stamparli usando il puntatore a?
    Se alla fine del tuo codice scrivo:
    codice:
    a--;
    printf("%d",*a);
    Mi stampa un valore altissimo,probabilente è l' indirizzo di a.
    Da che vedo che a non si comporta come un normale puntatore.
    La mia domanda è: perchè?

  4. #14
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Forse non sono stato chiaro....intendo dire:alla fine del ciclo,quando ho finito di allocare la memoria per l' array di variabili,ad esempio col codice:
    codice:
    void main()
    {
        int *a,i=1;
        a=(int*)malloc(sizeof(int));
        while(i!=1000)
        {
            scanf("%d",a);
            if(i>1)
              a=(int*)realloc(a,(i+1)*sizeof(int));
            if(*a==-999)
                i=999;
            i++;
        }
        printf("%d",*a);
        a--;
        printf("%d",*a);   //qua stampa un valore assurdo
    }
    a alla fine punta all' ultimo elemento allocato e ricevuto con scanf,ma non posso eseguire operazioni con a come fosse un puntatore normale.
    Dopo a--; non si sa a cosa punta?
    Perche'?

    EDIT:
    Era ancora un segmentation fault ragazzi scusate,ho risolto.

  5. #15
    per evitarti mal di testa certi futuri, controlla SEMPRE il valore restituito dalla realloc:

    http://www.cplusplus.com/reference/c...tdlib/realloc/

    Return Value
    If the function failed to allocate the requested block of memory, a NULL pointer is returned, and the memory block pointed to by argument ptr is left unchanged.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.