|
|
|
![]() |
|
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: 12849
|
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 19: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: 15:07.