Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18
  1. #11
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    boh, probabilmente (anzi sicuramente) sono io che non capisco... se dichiaro un puntatore a char punterà al primo carattere della stringa, quindi posso definire stringhe di lunghezza indefinita... e lo faccio senza strcpy nel modo seguente: io.cognome="rossi"; / io.nome= "Paolo";

    o sbaglio?

    lol, se c'è un argomento che non digerisco ancora sono le stringhe.

  2. #12
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Originariamente inviato da Lak3d
    boh, probabilmente (anzi sicuramente) sono io che non capisco... se dichiaro un puntatore a char punterà al primo carattere della stringa, quindi posso definire stringhe di lunghezza indefinita... e lo faccio senza strcpy nel modo seguente: io.cognome="rossi"; / io.nome= "Paolo";

    o sbaglio?

    lol, se c'è un argomento che non digerisco ancora sono le stringhe.
    Effettivamente le stringhe in C sono un po rognose.
    Comunque utilizzado un puntatore al posto di un array predefinito puoi ottimizzare l'utilizzo della memoria (infatti io uso sempre puntatori).

    Comunque strcpy e fare un'eguaglianza con un const char * è uguale.
    Difatti i compilatori prendono "Ciao a tutti" come un const char *
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #13
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    Non è che le stringhe so un pò rognose, è che le stringhe in c non esistono.

    Inoltre se nel programma si definisce una stringa come
    char *c; cercando di assegnargli una stringa al run-time probabilmente andrà in crash, mentre la definizione

    char *c="ggkgkjhgjkghkjgk";

    oppure char *c = (char *)malloc(sizeof(char));

    non creano errori, ma hanno significato diverso.

    la seconda creata con malloc viene allocata nella memoria dinamica quindi la si può modificare senza problemi di sforamento in altri indirizzi senza problemi, la prima può essere lunga a piacere ma come si vede all'atto della compilazione è già definita in lunghezza cosicchè il compilatore sa già quale sarà la sua lunghezza, come detto se si provasse a modificarla andrebbe in crash o probabilmente funzionerebbe fino al superamento delle celle disponibili dalla stringa di partenza.

    nelle struct mi sembra non ricordo bene che i campi vengano creati a livello dinamico, quindi inutile sprecare memoria creando vettori di caratteri che magari non sarebbero mai usati in un'applicazione, tanto vale usare puntatori che si adattano automaticamente alle dimensioni di ciò che si inserisce.

    Ecco perchè il puntatore è largamente usato nelle struct.

  4. #14
    Originariamente inviato da salvio78
    nelle struct mi sembra non ricordo bene che i campi vengano creati a livello dinamico, quindi inutile sprecare memoria creando vettori di caratteri che magari non sarebbero mai usati in un'applicazione, tanto vale usare puntatori che si adattano automaticamente alle dimensioni di ciò che si inserisce.
    I puntatori non si adattano a un bel niente, sono semplicemente dei "rimandi" a della memoria; semmai sei tu che allochi quanta memoria ti serve, risparmiando ovviamente dello spazio rispetto alle stringhe a lunghezza fissa.
    Comunque le stringhe allocate dinamicamente hanno diversi problemi che scoprirai facilmente quando inizierai a lavorare con progetti di dimensioni non indifferenti; in primis, se la stringa viene passata a diverse funzioni oppure è condivisa c'è il rischio che in una funzione di cleanup venga deallocata, mentre altre funzioni, che magari sono in esecuzione in un thread differente, ne hanno ancora un riferimento; tentando di leggere questa stringa con buone probabilità andranno a leggere dati non validi. In seconda battuta è sempre un problema passare un puntatore a stringa tramite IPC, perché ogni processo dispone di un suo heap in cui viene allocata la memoria a runtime, che non è leggibile dagli altri processi. Ora, passando un puntatore ad una stringa del tuo processo ad un altro processo tramite, ad esempio, una pipe, si otterrà con le massime probabilità un errore, perché l'altro processo tenterà di leggere della memoria che non può leggere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #15
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    già che ci sono ne approfitto per chiedervi una cosa: conoscete qualche buona pagina web che tratti l'argomento delle "stringhe" in C? Ho un manuale sul C ma il capitolo si limita a introdurre le inizializzazioni e null'altro, passando immediatamente a descrivere le funzioni per la manipolazione dei caratteri e delle stringhe... magari qualcuno di voi ha link da condividere che trattano l'argomento a fondo...

    Grazie.

  6. #16
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Lak3d
    boh, probabilmente (anzi sicuramente) sono io che non capisco... se dichiaro un puntatore a char punterà al primo carattere della stringa, quindi posso definire stringhe di lunghezza indefinita... e lo faccio senza strcpy nel modo seguente: io.cognome="rossi"; / io.nome= "Paolo";

    o sbaglio?
    Sbagli.

    Se allochi una stringa con

    char * s;
    s = (char *)malloc(100);

    NON puoi scrivere

    s = "Rossi";

    ma devi comunque scrivere

    strcpy(s, "Rossi");

    Originariamente inviato da Lak3d
    lol, se c'è un argomento che non digerisco ancora sono le stringhe.
    E infatti non le hai ancora compreso pienamente ...

    Le stringhe in C non sono un tipo di dato nativo ma, semplicemente, una sequenza di char terminata da uno zero binario. Ecco perche' usare un array di dimensioni note o un puntatore a char di dimensioni variabili, non cambia assolutamente nulla (a parte, come ti ho detto e come si e' detto, l'efficienza dello sfruttamento della memoria e la zona di memoria usata per la stringa stessa ...).

    Per comprendere meglio le stringhe, ti consiglio di rivedere il funzionamento dei puntatori ...

  7. #17
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    Originariamente inviato da oregon
    Sbagli.

    Se allochi una stringa con

    char * s;
    s = (char *)malloc(100);

    NON puoi scrivere

    s = "Rossi";

    ma devi comunque scrivere

    strcpy(s, "Rossi");
    codice:
    typedef struct card{
       char *cognome;
       char *nome;
       int eta;
    } Persona;
    
    int main(){
    
    Persona io;
    
    io.nome="Paolo";
    io.cognome="Rossi";
    ti assicuro che funziona...


    E infatti non le hai ancora compreso pienamente ...

    Le stringhe in C non sono un tipo di dato nativo ma, semplicemente, una sequenza di char terminata da uno zero binario. Ecco perche' usare un array di dimensioni note o un puntatore a char di dimensioni variabili, non cambia assolutamente nulla (a parte, come ti ho detto e come si e' detto, l'efficienza dello sfruttamento della memoria e la zona di memoria usata per la stringa stessa ...).

    Per comprendere meglio le stringhe, ti consiglio di rivedere il funzionamento dei puntatori ...
    Lo so che il tipo stringa in C non esiste... non cambia niente per il fatto che un puntatore a char punta al primo carattere della stringa, mentre un array è comunque un puntatore al suo primo elemento... o sbaglio?
    Il fatto è che secondo me cambia nel momento che faccio quanto mostrato nel quote sopra...

  8. #18
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Lo so che funziona ... e per questo ti dico che devi dare una ripassata all'argomento puntatori ...!

    Per capirci, dopo che hai assegnato il nome Paolo, prova a modificare l'ultima lettera da o in a in modo che il nome diventi Paola ...

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 © 2026 vBulletin Solutions, Inc. All rights reserved.