Domanda

Voglio spostare un grosso pezzo di dati che ho nella mia memoria. Sfortunatamente questi dati vengono salvati come array e non posso cambiarli. Non posso usare array circolare, perché la stessa memoria viene utilizzata anche da un paio di metodi Fortran che non voglio cambiare. Inoltre, gli array sono accessibili molto spesso tra il movimento. Quindi posso farlo:

int *array = (int*) malloc(sizeof(int)*5);
int *array2=NULL;
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
array2=array+1;
memmove(array,array2,5*sizeof(int));
array=(int*) realloc(array,5);

Questo dovrebbe funzionare bene, ma sembra così dispendioso;). Se potessi dire al mio compilatore di portare via i dati sul lato sinistro di un array di restringimento, i miei dati si insinuano in una specie di memoria, ma non dovrei fare alcuna copia. Come questo:

int *array = (int*) malloc(sizeof(int)*5);
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
array=(int*) realloc_using_right_part_of_the_array(array,5);

Quindi fondamentalmente voglio finire con un puntatore a array+1, con il 4 byte rimasto liberato. Ho giocato in giro con free() e malloc() Ma non ha funzionato ... Sono consapevole che il Realloc potrebbe anche provocare una chiamata Memcpy, ma non sempre! Quindi potrebbe essere più veloce, non è vero?

È stato utile?

Soluzione

No. Non c'è modo di restituire la parte inferiore della memoria che hai assegnato. Inoltre, il tuo codice originale è sbagliato, dal momento che stai copiando la memoria indeterminata.

int *array = (int*) malloc(sizeof(int)*5);
// Fill memory:
// array - {'J', 'o', h', 'n', '\0'}; 
int *array2=NULL;
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
// array - {'J', 'o', h', 'n', '\0', X};
array2=array+1;
// array2 pointer to 'o of array.
memmove(array,array2,5*sizeof(int));
// This copies the indeterminate x:
// array - {'o', h', 'n', '\0', X, X}
array=(int*) realloc(array,5);
// array - {'o', h', 'n', '\0', X}

X significa indeterminato.

Altri suggerimenti

Perché non copi semplicemente gli elementi uno per uno?

#define NELEMS 5
for (i = 0; i < NELEMS - 1; i++) {
    array[i] = array[i + 1];
}
array[NELEMS - 1] = 0;

oppure usa memmove Come hai fatto, ma senza il trasferimento

#define NELEMS 5
memmove(array, array + 1, (NELEMS - 1) * sizeof *array);
array[NELEMS - 1] = 0;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top