RISOLTO [C] dichiarazione stringhe

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

demda

Utente Attivo
Messaggi
352
Reazioni
49
Punteggio
40
Ciao a tutti, sul libro che sto leggendo su C, sta scritto che è possibile dichiarare una stringa in 2 modalità:

1)Come vettore:
C:
char str[ 20 ];

2)Come puntatore:
C:
char *str;

Ora mi chiedo, com'è possibile utilizzare una variabile di tipo puntatore a carattere come se fosse una stringa ?

scrivendo ad esempio anche qualcosa di questo tipo:
C:
#include <stdio.h>

int main (int argc, char *argv[]){
    char *str = "Hello world";

    printf("%s \n",str);
    return 0;
}

Quindi mi chiedo come sia possibile che questo codice scritto qua sopra, funziona correttamente ? Cosa mi sono perso ?
 
Ultima modifica:
Per definizione una stringa è semplicemente una sequenza di caratteri (byte consecutivi) terminata con '\0', di conseguenza str referenziato con * contiene l'indirizzo di memoria di str[0]

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Penso proprio di sì, ma quando certe cose vengono implementate è perché servono a specifici usi (rivedi anche i tuoi stessi precedenti post). Se vuoi imparare a programmare attieniti alla forma canonica e impara a scrivere secondo quanto previsto dallo standard.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Semplicemente str punta ad una stringa costante che non puoi utilizzare come buffer.

Se vuoi compiere operazioni di input devi allocare dinamicamente memoria, ipotizzando una dimensione massima dell’input o man mano allargando la stringa (quello che fa std::basic_string in C++)
 
Ok, due domande:
1) Se io dichiaro una stringa in questo modo, posso poi utilizzarla con la sintassi classica di un vettore ?

2) Se io dichiaro una stringa in questo modo come posso effettuare l'input da tastiera ?

Inviato da Mi A2 Lite tramite App ufficiale di Tom\'s Hardware Italia Forum
Per avvalorare da tastiera una stringa dichiarata come puntatore a char devi prima allocare la memoria, ad esempio con la funzione malloc, oppure con calloc che in più la inizializza a zero. Quando non serve più, occorre liberare la memoria allocata, con la funzione free.
Esempio:
char *str = malloc(5);
alloca cinque byte per una stringa di cinque caratteri (compreso il carattere di terminazione)
Alla fine, con free(str); liberi la memoria allocata.

Inviato da Mi 9 Lite tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Per avvalorare da tastiera una stringa dichiarata come puntatore a char devi prima allocare la memoria, ad esempio con la funzione malloc, oppure con calloc che in più la inizializza a zero. Quando non serve più, occorre liberare la memoria allocata, con la funzione free.
Esempio:
char *str = malloc(5);
alloca cinque byte per una stringa di cinque caratteri (compreso il carattere di terminazione)
Alla fine, con free(str); liberi la memoria allocata.

Inviato da Mi 9 Lite tramite App ufficiale di Tom\'s Hardware Italia Forum
C:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]){
    char *str = malloc(6);

    printf("inserisci -> ");
    scanf("%s",str);

    printf("%s\n",str);
    return 0;
}

In questo modo se non ho capito male il puntatore str punta ad una stringa di 6 byte, però se compilo ed eseguo il codice ed inserisco una stringa con più di 6 caratteri mi viene stampata a video senza problemi, non dovrei avere un errore ?
questo significa che i caratteri in eccesso sono stati memorizzati in celle di memoria consecutive a quelle della stringa ma riservate ad altri processi / programmi ?
se si, potrebbe essere un problema ?

lo stesso accade con questo sorgente:
C:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]){
    char str[6];
    
    printf("inserisci -> ");
    scanf("%s",str);
    
    printf("%s\n",str);
    return 0;
}
 
C:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]){
    char *str = malloc(6);

    printf("inserisci -> ");
    scanf("%s",str);

    printf("%s\n",str);
    return 0;
}

In questo modo se non ho capito male il puntatore str punta ad una stringa di 6 byte, però se compilo ed eseguo il codice ed inserisco una stringa con più di 6 caratteri mi viene stampata a video senza problemi, non dovrei avere un errore ?
questo significa che i caratteri in eccesso sono stati memorizzati in celle di memoria consecutive a quelle della stringa ma riservate ad altri processi / programmi ?
se si, potrebbe essere un problema ?

lo stesso accade con questo sorgente:
C:
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]){
    char str[6];
   
    printf("inserisci -> ");
    scanf("%s",str);
   
    printf("%s\n",str);
    return 0;
}
Non giocare con la memoria. Scrivere/leggere fuori dai limiti ha un comportamento indefinito. Ora ti è andata bene ma potresti ottenere SIGSEGV

Se vuoi leggere una quantità indefinita di caratteri devi utilizzare strutture dati apposite (quale è std::string)
 
Non giocare con la memoria. Scrivere/leggere fuori dai limiti ha un comportamento indefinito. Ora ti è andata bene ma potresti ottenere SIGSEGV

Se vuoi leggere una quantità indefinita di caratteri devi utilizzare strutture dati apposite (quale è std::string)
Ok, volevo capire solo questo. grazie mille a tutti
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top