nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da Pitagora:
@nessuno: no |
Non sono OT ... hai proposto tu quel pezzo ... volevo sapere da dove viene ... un libro (non credo) ... quindi?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Postato originariamente da nessuno:
Postato originariamente da Pitagora:
@nessuno: no |
Non sono OT ... hai proposto tu quel pezzo ... volevo sapere da dove viene ... un libro (non credo) ... quindi? |
è la guida di blacklight !
--------------------------------------------------------
Ho fatto degli esempi per capire meglio l'allocazione dinamica della memoria.
Codice sorgente - presumibilmente C# |
1 ) int *p = malloc (5 * sizeof(int)); /* alloca 20 byte. Sarebbe l'equivalente di scrivere: int p[5] (+ o -) */ 2 ) int *p = malloc (sizeof(int)); /* alloca 4 byte. Puà contenere solo un numero */ 3 ) char *o = malloc (2 * sizeof(char)); /* qui è come se avessi char *o[2] = {"ciao", "non_importa_quanto_sia_grande la_stringa_conta_solo_l'indice_giusto_?", NULL}; */ strcpy(o, "ciao"); strcpy(*(o + 1), "ciao"); 4) char *ca = malloc(7+1); /* adesso posso inizializzare il puntatore *ca con una stringa di 6 caratteri. Il 7° sarà riservato a NULL */ strncpy(ca, "ciao_c", 6);
|
Mi potreste correggere dove ho sbagliato, chiaramente ! ? |
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
è la guida di blacklight ! |
Non so chi sia, ma se ha scritto void invece di void * (o puntatore a void) è sbagliata e andrebbe corretta ...
1) int *p = malloc(5 * sizeof(int)); /* alloca 20 byte. Sarebbe l'equivalente di scrivere: int p[5] (+ o -) */ |
Sì ...
2) int *p = malloc(sizeof(int)); /* alloca 4 byte. Puà contenere solo un numero */ |
Solo un int ... (devi essere preciso ...)
3) char *o = malloc(2 * sizeof(char)); /* qui è come se avessi char *o[2] = {"ciao", "non_importa_quanto_sia_grande la_stringa_conta_solo_l'indice_giusto_?", NULL}; */
strcpy(o, "ciao");
strcpy(*(o + 1), "ciao");
|
Sbagliato.
Con la prima malloc allochi lo spazio per due caratteri. Ovvero è come se avessi
char o[2];
e non char *o[2]. Ovviamente tutto il resto è sbagliato essendo la stringa "ciao" fatta da 4+1 caratteri
4) char *ca = malloc(7+1); /* adesso posso inizializzare il puntatore *ca con una stringa di 6 caratteri. Il 7° sarà riservato a NULL */
strncpy(ca, "ciao_c", 6);
|
Sbagliato ... Hai scritto 7+1, quindi 7 caratteri più l'ottavo per il NULL ...
(ovvero ... anche 6+1 caratteri ci entrano ma non è chiaro perché tu l'abbia dimensionato con 8 caratteri)
Ultima modifica effettuata da nessuno il 23/07/2010 alle 22:38
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Postato originariamente da Pitagora:
Postato originariamente da nessuno:
Postato originariamente da Pitagora:
@nessuno: no |
Non sono OT ... hai proposto tu quel pezzo ... volevo sapere da dove viene ... un libro (non credo) ... quindi? |
è la guida di blacklight !
--------------------------------------------------------
Ho fatto degli esempi per capire meglio l'allocazione dinamica della memoria.
Codice sorgente - presumibilmente C# |
1 ) int *p = malloc (5 * sizeof(int)); /* alloca 20 byte. Sarebbe l'equivalente di scrivere: int p[5] (+ o -) */ 2 ) int *p = malloc (sizeof(int)); /* alloca 4 byte. Puà contenere solo un numero */ 3 ) char *o = malloc (2 * sizeof(char)); /* qui è come se avessi char *o[2] = {"ciao", "non_importa_quanto_sia_grande la_stringa_conta_solo_l'indice_giusto_?", NULL}; */ strcpy(o, "ciao"); strcpy(*(o + 1), "ciao"); 4) char *ca = malloc(7+1); /* adesso posso inizializzare il puntatore *ca con una stringa di 6 caratteri. Il 7° sarà riservato a NULL */ strncpy(ca, "ciao_c", 6);
|
Mi potreste correggere dove ho sbagliato, chiaramente ! ? |
quando utilizzi la funzione malloc, esegui sempre un cast implicito; in questo modo:
Codice sorgente - presumibilmente C/C++ |
...
int *p=NULL;
p=(*int) malloc(sizeof(int)); // alloca lo spazio per un int.
...
|
L' esempio n°3 è totalmente sbagliato; infatti un char può contenere solo un carattere, non una stringa. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da Poggi Marco:
un cast implicito |
cast esplicito ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
ok grazie ragazzi adesso ho capito
|
|