2012-04-21 5 views
1

Lorsque j'essaie de compiler le code C suivant, j'obtiens une erreur de bus. Je suppose que cela a quelque chose à voir avec la façon dont j'ai appelé memcpy, mais je ne peux pas le comprendre. Toute aide serait grandement appréciée!erreur de bus: 10. Code C, exemple malloc

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 

    char *p = (char*)malloc(sizeof(char)*11); 
    // Assign some value to p 
    p = "hello"; 


    char *name = (char*)malloc(sizeof(char)*11); 
    // Assign some value to name 
    name = "Bye"; 

    memcpy (p,name,sizeof(char)*10); // Problem begins here 
    return 0; 
} 
+0

Autres remarques: [Ne pas convertir la valeur de retour de malloc] (http://stackoverflow.com/questions/605845/). Pourquoi utilisez-vous 'memcpy' pour copier * strings * quand' strncpy' et des fonctions similaires existent dans ce but? – DCoder

Répondre

8

Ici p points une chaîne littérale après votre affectation, pas à votre mémoire allouée! Puis vous essayez d'écrire dans cette mémoire avec memcpy.

De nombreux compilateurs C allouent des littéraux de chaîne dans la mémoire morte, d'où l'erreur de bus.

Pour résoudre votre problème, vous devez copier les caractères h, e, l, l, o dans l'espace que vous avez alloué pour p dans la première ligne de main, en utilisant strncpy. Cela garde p pointant vers la mémoire que vous avez vous-même allouée; le plus tard memcpy ira bien (à condition de ne pas déborder votre tampon bien sûr).

Notez qu'en général, lorsque vous affectez directement une variable chaîne, vous indiquez la variable à une adresse mémoire différente. Dans votre code, vous avez alloué de l'espace pour quelques chaînes, mais lorsque vous affectez des chaînes de caractères aux variables, vous changez l'emplacement vers lequel elles pointent, provoquant une fuite de mémoire.

+0

Y at-il un moyen d'écrire sur p? – Sid

+0

Répondu lors d'une modification. –

+0

Merci beaucoup! J'ai essayé de comprendre cela depuis un moment maintenant! – Sid

0

Dans votre code, p = "hello" le "hello" renvoie un pointeur qui pointe vers une chaîne hello et le bonjour ne peut pas être modifié. Vous utilisez p = "hello" signifie faire p point à cette chaîne aussi. Donc, quand vous essayez de le changer, vous obtiendrez une erreur. La bonne manière est comme suit: char a[] = "hello"; ou

char *a = malloc(sizeof(char)*11); /*cast is not good*/ 
strcpy (a, "hello"); 

BTW, utilisez malloc mieux de ne pas en utilisant comme coulé (char *) ou (int *).