Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    4

    [C] Lunghezza di un array di interi

    Ciao a tutti,
    mi sto (ri)avvicinando al C e sono un po' arruginito.
    Voglio determinare la lunghezza di un array di interi. Tutto bene usando sizeof(array).
    con array definito staticamente. Se definisco invece un puntatore all'array come fatto nel codice riportato, la dimensione che mi viene restituita e' quella del puntatore.

    codice:
    #include <stdio.h>
    
    main() {
    
    int dim,i,val;
    int *a;
    
    	printf("quanti elementi nell'array?\n");
    	scanf("%d", &dim);
    	
    	int testArray[dim];
    	
    	for(i=0; i<dim; i++) {
    		printf("Elemento %d:", i);
    		scanf("%d",&val);
    		testArray[i] = val;
    	}
    	
    	a=testArray;	
    		
    	printf("Misura array a (pointer): %d\n", sizeof(a)/sizeof(int));
    	printf("Misura array arrayTest (statico): %d\n", sizeof(testArray)/sizeof(int));
    	
    	printf("%d %d %d\n", testArray, a, &testArray[0]);
    	
    }
    Ma nome dell'array e puntatore all'indirizzo [0] sono la stessa cosa?
    Come faccio a determinare la lunghezza della array tramite il puntaore al primo elemento, il che ad esempio puo' succedere con l'allocazione dinamica di memoria?

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ciao,

    non vorrei iniziare a sparare cavolate e spero che qualche del forum possa smentirmi subito nel caso mi sbaglio:

    1) sizeof() non è una funzione di libreria ma un'operatore del linguaggio, quindi intrinseco al compilatore. Quando compili un codice con una chiamata del tipo:
    codice:
    int array[10];
    sizeof(array)
    il compilatore si comporta come se tu avessi scritto (per comprenderci): "sizeof(int *)*10".
    Questo non accade se invece array fosse un int*.

    2) l'allocazione dinamica presuppone che tu abbia fatto una malloc (o simile)...ma, qualsiasi funzione tu abbia usato per allocare, devi aver specificato la dimensione dell'array (con una cosa del tipo: malloc(10*sizeof(int))! Quindi...a cosa ti serve usare sizeof() per ricavare la dimensione?

    3) Non credo che questo sia corretto (anche se non comporta errori di compilazione...almeno sul tuo compilatore ):
    codice:
    scanf("%d", &dim);
    int testArray[dim];
    A cosa servirebbe l'allocazione dinamica se fosse possibile fare una cosa del genere?

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    sizeof(int)*10
    3) Non credo che questo sia corretto.
    Il C++ non usa estensioni del C99, quindi un compilatore C++ decente deve proprio rifiutare quella porcata. Il che può dirla lunga sulla qualità dei compilatori C++ che invece l'accettano.
    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.

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    il compilatore si comporta come se tu avessi scritto (per comprenderci): "sizeof(int *)*10".
    Esatto, vole dire sizeof(int)*10
    Grazie!

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    4
    Ciao Jobv,
    grazie delle tue risposte, pero' ancora non mi e' chiara una cosa. Al di la' del fatto che come dici al punto 2 (ed io condivido) ha scarso senso la mia domanda nel caso di allocazione dinamica, sarebbe possibile capire la dimensione dell'array di interi? Non esiste un elemento finale tipo lo '\0' usato per le stringhe, giusto?

    Poi,solo per precisazione,

    codice:
    	scanf("%d", &dim);
    	
    	int testArray[dim];
    mi risulta sia consentito dall'estensione C99. O sbaglio?

    Grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Solo le stringhe hanno il terminatore da quanto mi risulti.

    Riguardo alle estensioni credo che tu abbia pienamente ragione!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.