Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    problemi con azzeramento vettore in C

    ho il seguente problema, devo scorrere un vettore di 1048576 elementi ed ad ogni elemento del vettore, attribuire un valore casuale

    ho il seguente pezzo di codice:

    unsigned int i=0;
    int vettore[1048576];
    for(i=0; i<1048576;i++){
    vettore[i]="8"; // asseganzione
    }

    quando compilo con gcc -Wall -o name name.c tutt ok
    ma all'esecuzione il prg va in Segmentation fault ?????


    Qualcuno mi può indirizzare sulla retta via? come mai?

    grazie Luca

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Stack overflow. Quell'array è troppo grosso per dichiararlo in quel modo. Controlla se tra le opzioni del gcc c'è un flag per riservare più spazio allo stack. (Minimo 1048576 *4 +1)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    In alternativa puoi allocare l'array nell'heap con malloc.
    Tra l'altro, che cosa vuoi ottenere con
    codice:
    vettore[i]="8"; // asseganzione
    ? Se è attiva la condivisione delle stringhe (cosa probabile) tutti gli elementi avranno lo stesso valore, in caso contrario avranno probabilmente valori consecutivi e riempirai l'eseguibile con 1 MB di "8" inutile.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    vettoreþ[i]=0; sarà un vettore di conterrà un 1MB di indirizzi di memoria,

    allora credo che la cosa migliore sia dichiarare il vettore in questo modo, riservando lo spazio necessario per la sua rappresentazione in memoria:

    int vettore[]i;
    vettore[]=(int *) malloc(1048576 * sizeof(int));

    in questo modo riservo in memoria spazio per un vettore pronto a contenere 1048576 elementi di tipo interi.
    giusto?

    grazie

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si. Ricorda di deallocarlo con free() quando non ti serve più.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da gigiachiara
    vettoreþ[i]=0; sarà un vettore di conterrà un 1MB di indirizzi di memoria,

    allora credo che la cosa migliore sia dichiarare il vettore in questo modo, riservando lo spazio necessario per la sua rappresentazione in memoria:

    int vettore[]i;
    vettore[]=(int *) malloc(1048576 * sizeof(int));

    in questo modo riservo in memoria spazio per un vettore pronto a contenere 1048576 elementi di tipo interi.
    giusto?

    grazie
    Direi che e' meglio cosi' ...

    codice:
       int *vettore;
       vettore = (int *) malloc(1048576 * sizeof(int));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    perchè ho ancora problemi?

    riga 14 int *vettore;
    riga 15 vettore = (int *) malloc(1048576 * sizeof(int));



    ecco gli errori che ho durante la compilazione
    warning: data definition has no type or storage class
    es5.c:15: warning: type defaults to ‘int’ in declaration of ‘vettore’
    es5.c:15: error: conflicting types for ‘vettore’
    es5.c:14: error: previous declaration of ‘vettore’ was here
    es5.c:15: warning: initialization makes integer from pointer without a cast
    es5.c:15: error: initializer element is not constant

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    1) che compilatore stai usando ?

    2) sicura che le righe che stai compilando siano quelle? Ci fai vedere "tutto" il codice che hai scritto ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    ecco il codice sto compilando con gcc -Wall -o name name.c

    #include <stdio.h>
    #include <stdlib.h>

    int *vettore; // vettore globale
    vettore = (int *) malloc(1048576 * sizeof(int));

    void funz(void);{
    for(i=0; i<1048576; i++){
    *(vettore+i)=1;
    printf("\nvetto[%d]=%d",i,*(vettore+i));
    }
    //free(vettore);
    }

    int main(int argc, char **argv){
    funz();
    return 0;
    }



    errori:
    prova1.c:5: warning: data definition has no type or storage class
    prova1.c:5: warning: type defaults to ‘int’ in declaration of ‘vettore’
    prova1.c:5: error: conflicting types for ‘vettore’
    prova1.c:4: error: previous declaration of ‘vettore’ was here
    prova1.c:5: warning: initialization makes integer from pointer without a cast
    prova1.c:5: error: initializer element is not constant
    prova1.c:7: error: expected identifier or ‘(’ before ‘{’ token

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In rosso le correzioni ...

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int *vettore;  // vettore globale
    
    void funz(void){
      int i;
      for(i=0; i<1048576; i++){
        *(vettore+i)=1;
    printf("\nvetto[%d]=%d",i,*(vettore+i));
      }
      //free(vettore);
    }
    
    int main(int argc, char **argv){
     vettore = (int *) malloc(1048576 * sizeof(int));
     funz();
     return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.