|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
[C/C++] struct e allocazione di memoria
Buona sera,
stavo vedendo dei video su youtube e in uno di questi il tipo fa questo esempio: Codice:
struct Data{
char buffer[100];
};
struct Data func(){
struct Data d;
strcpy(d.buffer,"stringa che non ricordo",100);
return d;
}
Secondo me invece, in cima allo stack resterà una struttura che contiene il puntatore al buffer; Perché l'intero array dovrebbe restare sullo stack? È per via del fatto che dichiara la struttura nella funzione? Poi... se fa strcpy su un array non inizializzato, non ha un segmentation fault?
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12859
|
Con quella signature è probabile che sia strncpy, la quale specifica tra le altre cose il numero massimo di bytes da scrivere (rispetto alla semplice strcpy).
Poiché la stringa è literal e const, questa è terminata da '\0', la copia avviene correttamente (la strncpy così come la strcpy si ferma se c'è un terminatore nella sorgente, la differenza è appunto che la prima effettua anche un controllo sul numero massimo di bytes da scrivere). Riguardo quello che succede in func, viene allocato spazio sullo stack pari a sizeof(struct Data), quindi i 100 bytes del buffer. Pur non essendo inizializzato il buffer (o meglio la memoria è allocata, contenuto "random") è comunque lecito scrivere sullo stack, quindi non hai alcun segmentation fault. A seconda del livello di ottimizzazione e di dove viene invocata func è possibile che non vi sia alcuna copia associata a quel "return d". Ultima modifica di WarDuck : 04-06-2016 alle 20:17. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Grazie mille del chiarimento
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:25.



















