Domanda Risolto C e costranti "stringhe"...

nostyn

Utente Electrum
12 Gennaio 2017
284
25
83
126
Ultima modifica:
Mi affligge un dubbio. Sebbene credo di aver frainteso cio' che ho letto: credo di aver capito che nel momento in cui si passa una costante stringa come argomento a una funzione (quale potrebbe essere printf), fondamentalmente viene passato il puntatore alla posizione del primo carattere della costante, Dunque suppongo che per poter passare la stringa costante "Hello World" a printf() , essa venga prima allocata in uno spazio di memoria, per poter poi passare il suo indirizzo alla funzione. Ma, se cosi' e', allora posso creare un puntatore e successivamente assegnare a quest'ultimo la posizione di una stringa costante? es. char *str; str = "Hello World"; e' un comportamento sempre definito o non e' definito dallo standard?
Qualcuno corregga le eventuali cavolate che ho scritto.. :patt:
 
Risposta semplice: no.
Basta guardare il source della printf. Viene copiato l'argomento in un buffer interno per costruire l'output, quindi eventuali modifiche all'area di memoria dell'input non vengono prese in considerazione.
 
  • Mi piace
Reazioni: nostyn
Risposta semplice: no.
Basta guardare il source della printf. Viene copiato l'argomento in un buffer interno per costruire l'output, quindi eventuali modifiche all'area di memoria dell'input non vengono prese in considerazione.
Grazie della risposta, tuttavia non sono sicuro di aver interpretato correttamente la tua risposta. Io non ho intenzione di apportare alcuna modifica all'area di memoria che contiene la costante, bensi' comprendere il meccanismo che si cela dietro le "stringe" costanti. Ovvero, quando vengono utilizzate all'interno del programma ad esempio in printf("Hello World") , dal momento che printf e' definito printf (const char *format, ...) , e dunque si aspetta come primo argomento un puntatore di tipo char , il fatto che richieda un puntatore mi fa pensare al fatto che si aspetti un indirizzo. Ora se si aspetta un indirizzo sta a significare che da qualche parte quella stringa dovra' pur essere memorizzata. Il fatto che poi questa stringa venga inserita in un buffer, copiata, alterata o altro non mi interessa, bensi' come viene trasferita alla funzione. E da cio' scaturisce appunto il secondo quesito. Ovvero se sia legale assegnare una costante a un puntatore: char *str; str = "Hello World"; provando ad eseguire il codice non da problemi, ma mi domando se sia legale oppure a discrezione del compilatore.
 
Ultima modifica:
credo di aver capito che nel momento in cui si passa una costante stringa come argomento a una funzione (quale potrebbe essere printf), fondamentalmente viene passato il puntatore alla posizione del primo carattere della costante
Sì, le stringhe in C sono un array di caratteri ASCII e terminano con '\0'.

Dunque suppongo che per poter passare la stringa costante "Hello World" a printf() , essa venga prima allocata in uno spazio di memoria, per poter poi passare il suo indirizzo alla funzione.
Non ti è dato sapere dove gli string literals risiedono in memoria, ma normalmente sono hardcodate nell'eseguibile. Il compilatore potrebbe costruire i due string literals "Hello World" e "World" senza ripetere la parola "World".

Ma, se cosi' e', allora posso creare un puntatore e successivamente assegnare a quest'ultimo la posizione di una stringa costante? es. char *str; str = "Hello World"; e' un comportamento sempre definito o non e' definito dallo standard?
Puoi farlo, ma non puoi modificarla: l'immutabilità è una proprietà associata al dato e non alla variabile.
 
  • Mi piace
Reazioni: nostyn
Sì, le stringhe in C sono un array di caratteri ASCII e terminano con '\0'.
Sisi lo so, per questa ragione ho inserito stringhe sempre tra apici, dal momento che sono consapevole che non esistono stringhe come tipo di dato in C.

Puoi farlo, ma non puoi modificarla: l'immutabilità è una proprietà associata al dato e non alla variabile.
Grazie mille, e' quello che volevo sapere. So che non puo' essere modificata dal momento che sono appunto "stringhe" costanti ma non avevo ben a chiaro se quel tipo di assegnazione fosse legale! :D