2015-10-21 2 views
-1

Je rencontre des problèmes avec memcpy en lançant une erreur de segmentation, et je n'arrive pas à localiser la source de l'erreur.Vous ne savez pas exactement, segfault sur memcpy?

typedef struct { 
    int record_code;     
    char* record_name;   
    char buffer[6004];  
} record; 

record* rec; 
char* ptr = rec->buffer; 

//--DEBUG 
printf("ADDR OF PTR: %p\n", ptr); 
printf("SIZE OF BUFFER: %d\n", sizeof(ptr->buffer)); 
//--End DEBUG 

create_record(ptr); 

Je veux ajouter une valeur int dans mon tampon, mais je me fais un SEGFAULT sur cette ligne

memcpy(ptr, &key, sizeof(key)); 

dans cette fonction

int counter = 0; 
int create_record(char* ptr) { 
    int key = counter; 

    //--DEBUG 
    printf("ADDR OF PTR: %p\n", ptr); 
    printf("SIZE OF KEY: %d\n", sizeof(key)); 
    //--End DEBUG 

    memcpy(ptr, &key, sizeof(key)); 
    ptr += sizeof(key); 

    int integer = rand_int(); 
    memcpy(ptr, &integer, sizeof(integer)); 
    ptr += sizeof(integer); 

    char* word = rand_string(); 
    memcpy(ptr, word, strlen(word)); 
    ptr += strlen(word);  

    counter++; 
} 

Les seules raisons que je pouvais Pensez à memcpy lancer un segfault est si les pointeurs sont des ordures ou la taille de la chose que je tente de jeter dans l'emplacement de la mémoire est supérieure à la mémoire que j'ai allouée. Mais j'essaie simplement de mettre un entier (taille = 4 octets) dans un buffer alloué à 6004 octets, donc ça ne semble pas être un problème de taille ... et l'adresse du pointeur que j'ai correspond à ce qu'il avait été créé à l'origine (je ne suis pas sûr si cela compte réellement tbh ...).

La sortie que je reçois des impressions sont ces

ADDR OF PTR: 0x10 
SIZE OF BUFFER: 64004 

(now inside create_record) 

ADDR OF PTR: 0x10 
SIZE OF KEY: 4 

Quelqu'un peut-il me dire où je vais mal?

Merci à l'avance

+0

'' enregistrement * rec'' crée pointeur sur la pile qui pointe vers nulle part (nulle ou indésirable). Vous devriez créer rec sur la pile ('' 'record rec''') ou utiliser malloc et ensuite le remplir sur tas – user996142

Répondre

1

rec ne pointe pas vers la mémoire allouée. Le déréférencement donne un comportement indéfini. Déjà le résultat

char* ptr = rec->buffer; 

résultat est indéfini.

au lieu du pointeur, juste définir

record rec; 

et initialize ptr comme

char* ptr = rec.buffer; 
+0

Oh je vois ... comment pourrais-je avoir raté ça? Merci pour votre aide rapide – ottocay

+0

@ottocay Vous êtes les bienvenus :-) – Downvoter

+0

@ottocay Si vous avez choisi la meilleure réponse, acceptez-la. Je ne dis pas cela parce que je suis un rep-who * e mais parce qu'il marque cette question comme résolue et contribue à garder l'état de ce site propre. – Downvoter