View Full Version : quesito puntatori c++
danyroma80
20-08-2006, 11:19
char* frase="Ciao a tutti";
In poche parole vorrei sapere se questa istruzione alloca ed inizializza la variabile frase e contemporanemante ne dichiara anche un puntatore alla stessa con identico nome.
"ciao a tutti" per forza di cose deve essere messo in memoria, suppongo nell'area statica.
il puntatore viene allocato e inizializzato al suo indirizzo
ciao
Barbalbero
20-08-2006, 12:36
Indubbiamente nell'area statica
"area statica" non vuol dire nulla, è un mito introdotto nelle università per permettere ai professori di esprimere concetti che richiederebbero approfondimenti tecnici al di fuori dei loro scopi didattici :D
chiamiamo le cose coi loro nomi: i caratteri della stringa così dichiarata vengono messi in qualche sezione dati dell'eseguibile che non ricordo se è impostata a sola lettura o meno; per quanto riguarda l'allocazione della variabile invece dipende da dove la dichiariamo: se è una variabile locale allora se ne va nello stack ed è inizializzata manualmente a runtime dal codice generato dal compilatore (PUSH indirizzodelprimocarattere), mentre se è una variabile globale se ne va nella sezione dei dati inizializzati e viene inizializzata all'indirizzo che avrebbe il primo carattere della frase se il modulo fosse caricato al suo base address (cosa che per un eseguibile avviene praticamente sempre); ad ogni modo, a quel punto della sezione .data viene associato un fixup per l'eventuale rilocazione.
ma come fate a mettere 12 caratteri in un char? non bisognerebbe scrivere
char frase[12]={'c','i','a','o',' ','a',' ','t','u','t','t','i'};
oppure il compilatore crea automaticamente un array?
:confused:
a parte il fatto che non sono 12 ma 13 :D comunque se guardi bene c'è un asterisco davanti a "char" nel post iniziale: danyroma80 ha dichiarato un puntatore che punta al primo carattere di una costante stringa
a parte il fatto che non sono 12 ma 13 :D comunque se guardi bene c'è un asterisco davanti a "char" nel post iniziale: danyroma80 ha dichiarato un puntatore che punta al primo carattere di una costante stringa
quindi frase[0]=='c', frase[1]=='i', ecc?
p.s. sono 12 :D
quindi frase[0]=='c', frase[1]=='i', ecc?
p.s. sono 12 :DSe è dichiarato così:
char* frase="Ciao a tutti";
allora sono 13 (è compreso il nullo '\0').
Se è dichiarato così:
char frase[12]={'c','i','a','o',' ','a',' ','t','u','t','t','i'};
allora sono effettivamente 12. Però dipende da cosa ti serve e da come vuoi usarlo ... non è una stringa a tutti gli effetti perché non ha il nullo finale.
non avevo pensato al nullo :muro:
Barbalbero
20-08-2006, 22:07
"area statica" non vuol dire nulla, è un mito introdotto nelle università per permettere ai professori di esprimere concetti che richiederebbero approfondimenti tecnici al di fuori dei loro scopi didattici :D
:confused: In che senso?? Intendi dire che non esistono il concetto di heap e stack?
si che esistono (a parte il fatto che spesso e volentieri li spiegano male), l'espressione che non significa nulla non è ne' heap ne' stack: è "area statica" (che suppongo opporsi ad "area dinamica"), che non hai inventato tu perché la sento spesso anche da me (anche nei corsi di Sistemi Operativi :muro: )
magari apro un caso su una pignoleria ma non è tanto questa cosa specifica, ma tutta la diffusa niubbaggine che affligge questa misteriosa specie animale che popola le università italiane (i professori), niubbaggine che si basa su tante di queste piccole cose
p.s. sono 12 :D seguiti da un bel po' di garbage :asd:
scusate se faccio sempre le domande nei post degli altri, ma ho anchio una domanda sui puntatori a char.
avendo una funzione che prende in argomento uno di questi puntatori a char, come devo passarlo alla funzione e come devo dichiarare l'argomento della funzione?
void funzione(char* frase);
e
int main(){funzione(frase);}
vanno bene?
BountyKiller
21-08-2006, 12:13
edit
BountyKiller
21-08-2006, 12:23
edit
a me risulta che il prototipo ANSI del main sia:
int main(int argc, char* argv[]) embè? :huh:
facendo
int main(){funzione(frase);}
con funzione(frase) che ritorna un char*, veramente la funzione ritorna void...
il compilatore tenterà probabilmente un cast a int del char* perché? :huh:
poi se stiamo parlando di implementazioni particolarii di main..... stiamo parlando di questo prototipo:
int main();
BountyKiller
21-08-2006, 12:40
ops ho letto male quello che ha scritto angel)..... per un attimo ho creduto che parlasse degli argomenti di main.....
ops ho letto male quello che ha scritto angel)..... e anche quello che hai scritto tu :huh:
per un attimo ho creduto che parlasse degli argomenti di main..... questo attimo è durato dall'una e un quarto alle due meno venti :Prrr:
BountyKiller
21-08-2006, 15:59
stavo facendo anche altre cose :rolleyes:
e che non l'avevo capito io? sempre a pranzare sti pelandroni, tutti alla stessa ora :O
non ci sono più gli informatici di una volta, che stavano a programmare 36 ore su 48 ("and proud") :D
caviccun
21-08-2006, 22:27
Non conosco bene il C , però mi sembra di ricordare che , se una stringa non aveva il carattere null finale , poteva andare a sporcare la memoria adiacente e mandare in blocco il pc.
mi sembra di ricordare che , se una stringa non aveva il carattere null finale , poteva andare a sporcare la memoria adiacente e mandare in blocco il pc
e direi che ricordi maluccio :D
innanzitutto se dichiari una stringa il /0 finale viene messo in automatico, e se per caso non ci fosse spazio interverrebbe cmq il sistema di protezione dello spazio di indirizzamento della memoria del sistema operativo..
insomma in poche parole al max rischi che il tuo programma faccia un bel segmentation fault.. :fagiano:
insomma in poche parole al max rischi che il tuo programma faccia un bel segmentation fault.. :fagiano: le sue espressioni suonano antiche e nostalgiche ("mi pare di ricordare che..."), quindi suppongo si riferisse a Ms-DOS :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.