2010-09-27 6 views
1

J'ai le problème que memcpy/memmove change le pointeur d'un struct FOO foo, qui n'est ni src ni destination de la fonction. Voici les sorties gdb:Comportement étrange de memcpy/memmove

Avant memmove(y,y_temp,size_y);:

(gdb) p y 
$38 = 0xbff7a2e0 
(gdb) p y_temp 
$39 = (float *) 0x815ea20 
(gdb) p foo 
$40 = (FOO *) 0x81d4e90 

et après:

(gdb) p y_temp 
$41 = (float *) 0x343434 
(gdb) p y 
$42 = 0x343434 
(gdb) p foo 
$43 = (FOO *) 0x343434 

Voici les définitions des variables:

FOO *foo; 
float y[nsamples]; 
float size_y = nsamples*sizeof(y); 
float* y_temp = (float*) malloc(size_y); 

Je sais, que n'est pas un bug avec memcpy/move, donc je cherche un tipp, quelle erreur de programmation de mon côté pourrait avoir l'a causé.

Merci

Répondre

4
size_t size_y = sizeof(y); 

sizeof(y) vous donne déjà la taille du tableau entier, et le type doivent être size_t.

Si vous faites cela, y et la mémoire y_temp sera de la même taille. Vous devriez également vous assurer que vous allez dans la bonne direction. En ce moment, y est la destination. En outre, si la source et la destination ne se chevauchent pas (ce qu'elles ne seront pas ici), utilisez memcpy.

+0

+1, et une seconde fois aussi si je pouvais pour le conseil 'size_t' –

+0

Merci, je savais que c'était un de ces petits bugs stupides! – Framester

1
float y[nsamples]; 
/* let's say a float is 4 bytes and nsamples is 13 */ 
float size_y = nsamples*sizeof(y); 
/* size_y is now 13 * 52 == 676 */ 

puis vous faire

memmove(y, y_temp, size_y); 

Mais y n'a pas assez d'espace pour tous size_y octets!