Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894

    [C] Domanda sugli Array

    Ho trovato questo:

    Per gli array l’inizializzazione è possibile solamente se sono stati dichiarati come extern o come static; quest’ultima classe di variabile verrà esaminata in seguito.

    Le variabili extern sono quelle che vengono definite prima di main. L’inizializzazione si ottiene inserendo i valori tra parentesi graffe, separati da una virgola:

    int voti[6] = {11, 18, 7, 15, 21, 9};


    Io ho provato a inizializzare l'array dentro al main ma valo stesso. Qual'è allora il significato di quella frase?

  2. #2
    Dove hai letto quella puttanata? gli array possono essere inizializzati sempre (sia che siano static, automatic, external, register e volatile).

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Infatti mi sembrava una puttanata...
    L'ho letto sul libro di Programmaizone in C di McGraw Hill


  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    codice:
    #import <stdio.h>
    
    main()
    {
      char *Pippo = "ROSSO";
      printf(Pippo);
      *(Pippo+3)='P';
      printf(Pippo);
    }
    In Windows va

    In Linux quando lancio il prog. mi da segmention fault quando vado a sostituire la S con la P

    Perchè?

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Faccio solo una supposizione, non sono sicuro di quanto scrivo, ma penso che dichiarando un puntatore in quel modo il compilatore faccia un'ottimizzazione, e gestisca la stringa come se fosse const.
    Suppongo che invece di allocare la memoria nello heap, inserisca la stringa nel segmento dati, e la renda non modificabile.

    Ti propongo un contro esempio:
    codice:
    #include <stdio.h>
    
    int main()
    {
      char ciccio[] = "ROSSO";
      char *Pippo = ciccio;
      printf(Pippo);
      printf("\n");
      *(Pippo+3)='P';
      printf(Pippo);
      printf("\n");
      return 0;
    }
    Ripeto, non sono sicuro di cio', se qualcuno piu' esperto ha la soluzione sono interessato anche io.
    Ciao,
    Lorenzo

  6. #6
    Non fa nessuna ottimizzazione. Un processo e' diviso (sotto Linux e sotto molti os) in tre regioni di memoria principali, il text, lo stack e l'heap (a cui viene associato spesso il BSS). Ora i dati possono essere sia letti che scritti in stack ed heap ma non nel text, dove possono essere solo letti. Fra le tante cose nel text vengono allocate le stringhe costanti (non const come parola chiave, bada bene) ovvero le stringhe tipo "uhggggg" o "cazzarola". se tu fai:

    char *p = "yuk"; essendo "yuk" allocato nel text fai puntare anche p in una zona del text (quella occupata da "yuk" ed essendo solo readonly se provi a modificare un elemento di quella zona ottieni un errore di segmentazione. Spero di essere stato chiaro, se hai dubbi chiedi.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Chiarissimo, grazie, ma non ho capito la logica con cui vengono trattati questi due casi:
    codice:
    char *str = "Stringa1";
    char str2[] = "Stringa2";
    Perche', nel primo caso "Stringa1" viene memorizzato nel text, mentre nel secondo "Stringa2" viene memorizzato nello heap (perche' e' li che viene memorizzato, vero?).

    BSS?

    Ultima cosa: hai detto, giustamente, che stringa costante e' diverso da const.
    In effetti il dubbio era venuto anche a me, visto che se fossero la stessa cosa sarebbe inutile specificare la keyword const. Mi spiegheresti meglio la differenza?

    Grazie per l'attenzione.
    Ciao,
    Lorenzo

  8. #8
    Allora..

    Riguardo la prima domanda noto un po di carenza di studio caro mio. Eh si perche' dovresti sapere che mentre nella prima fai un assegnamento al puntatore, nella seconda inizializzi un array e queste due operazioni sono concettualmente molto diverse. In poche parole questo e' quello che succede nei due casi:

    - "Stringa1" viene memorizato nel text. Al puntatore viene dato l'indirizzo di "Stringa1" (quindi una zona del text).

    - "Stringa2" viene memoriazzato nel text. Viene creato spazio sufficiente sullo stack per copiare "Stringa2". "Stringa2" viene copiato pari pari sullo stack (non nell'heap).

    Sono due concetti completamente diversi.

    Nel BSS vengono memoriazzate le variabili di tipo static (quelle che vengono settate automaticamente a 0).

    La parola chiave const non dichiara una costante, ma indica solo che la variabile a cui è associata probabilmente non muterà più il suo stato (come se fosse un consiglio al compilatore). discorso diverso in C++, se vuoi ne possiamo parlare. In C il concetto di costante in quanto tale in realtà non esiste, ma visto che "stringa1" e' readonly possiamo associarla al concetto di costante.

    spero di aver risposto alle tue domande, sennò richiedi

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Grazie per le risposte, ho cominciato da poco a guardare C e venendo da Java i puntatori non mi sono ancora chiari del tutto.
    Per C++ se ne riparlera' piu' avanti, prima o poi

    Grazie ancora.
    Ciao,
    Lorenzo

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    TheGreatWorld dove trovo documentazione su Heap Stack Text, visto che non ci capito nulla

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.