|
|
|
![]() |
|
Strumenti |
![]() |
#1 | ||
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
[C] confronto tra puntatori & ISO
Per esercizio, sto tentando di implementare le varie funzioni di string.h.
Ho dei problemi con memmove. Partiamo da memcpy, caso particolare di memmove in cui i puntatori passati come parametro non puntano ad oggetti in memoria che si sovrappongono: Codice:
void *memcpy(void *dest, const void *src, size_t n) { unsigned char *d = dest; const unsigned char *s = src; while (n--) { *d++ = *s++; } return dest; } Memmove, invece, dovrebbe coprire anche il caso in cui gli oggetti sorgente e destinazione overlappano. Dalla pagina di manuale: Quote:
Codice:
void *memmove(void *dest, const void *src, size_t n) { // dest < src, then copy from the beginning return memcpy(dest, src, n); } // otherwise copy from the end unsigned char *d = dest; const unsigned char *s = src; s += n; d += n; while (n--) { *--d = *--s; } return dest; } Quote:
1) cosa si intende per "object"? 2) cosa significa "relative locations in the address space" 3) perchè non posso confrontare i 2 puntatori come 2 interi per verificare se le regioni si sovrappongono?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" Ultima modifica di Oceans11 : 04-02-2014 alle 19:12. Motivo: chiarimento |
||
![]() |
![]() |
![]() |
#2 | |||
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Quote:
per esempio: se leggi dalla memoria un byte alla volta e poi vuoi processare questo byte come un intero, allora potresti avere risultati ben diversi a seconda dell'uso di signed/unsigned, poiche' se il byte letto da memoria e', poniamo byteVal=F8, allora se fai Codice:
int iVal = (int)byteVal; unsigned int uVal = (unsignedbyteVal; iVal=-8 uVal=4294967288 Quote:
1) Oggetto sembra indicare, in questo contesto, qualsiasi tipo di dato strutturato; 2) significa che sei giovane ![]() Address space e' piu' generico poiche' fa rientrare anche il caso dei processori che la MMU non ce l'hanno. Detto semplicemente: quando assegni un valore ad un puntatore, esso e' valido nel tuo spazio di indirizzamento. In una specifica pero' devono parlare in maniera generica e formale. 3) Non preoccuparti, puoi confrontari. La specifica che hai riportato non dice che non puoi confrontarli, ma specifica dei casi in cui il confronto deve avere senso, lasciando indeterminati tutti gli altri casi. Da quanto scritto nella specifica sappiamo che le strutture dovranno essere allocate in memoria in modo tale che gli elementi dichiarati prima abbiano indirizzo minore di quelli dichiarati dopo, che i vettori seguono piu' o meno lo stesso criterio, ... A rigor di logica si potrebbe pensare ad un sistema in cui questo non e' valido, ma sarebbe un processore progettato apposta per far fallire il tuo codice. Per quanto riguarda la mia umile esperienza, non ho mai visto nulla del genere ma magari il contributo di qualcuno puo' portare un esempio reale.
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 07-02-2014 alle 08:46. |
|||
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
L'unica cosa che ci si avvicina è la gestione dello stack sui processori x86: le istruzioni di push non incrementano lo stack pointer ma lo decrementano, per cui gli elementi inseriti dopo hanno un indirizzo minore di quelli inseriti prima, ma parliamo di elementi appartenenti a strutture diverse, quindi siamo ancora conformi alla specifica.
Forse i processori giapponesi funzionano al contrario... scherzo! ![]() |
![]() |
![]() |
![]() |
#4 | |||
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Quote:
Quote:
Ma che succede nel caso confronto 2 puntatori a 2 oggetti diversi? Behavior undefined sta per machine e compiler dependent? Se in questo caso non sono interessato all'aritmetica dei puntatori, proprio in virtù dello spazio virtuale di indirizzamento (che dovrebbe darmi un livello maggiore di astrazione, uniformando la "vista" degli indirizzi in ram/cache/paging file etc) perchè dovrebbe essere indefinito il comportamento di un confronto tra entità che si potrebbero trattare come interi? @Daniels: in effetti ci avevo sbadatamente pensato anche io allo stack che cresce verso il basso.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:26.