RISOLTO [C] dichiarazione stringhe

Stato
Discussione chiusa ad ulteriori risposte.

demda

Utente Attivo
352
49
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:

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
  • Mi piace
Reazioni: demda

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Assolutamente si

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
  • Mi piace
Reazioni: demda

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
  • Mi piace
Reazioni: demda

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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++)
 
  • Mi piace
Reazioni: demda

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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
 
  • Mi piace
Reazioni: demda

demda

Utente Attivo
352
49
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;
}
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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)
 

demda

Utente Attivo
352
49
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.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili