Vous n'avez pas vraiment dit ce que "fonctionne" signifie, mais je suppose que vous êtes confus pourquoi dest
n'est pas en train de changer la nouvelle mémoire dans la fonction d'appel.
La raison en est que, dans votre fonction mystringcopy
, le paramètre dest
est une copie du pointeur dest
dans la fonction appelante.
Vous assignez ensuite cette copie à un nouveau tampon, faire la copie, puis la copie va. L'original est inchangé. Vous devez passer dest
comme pointeur (à un pointeur).
Aussi, je suppose que vous avez écrit ce que vous avez fait de la mémoire car il ne doit pas compiler tout comme (mauvais déréférencer dans la fonction d'appel). Voici le code fixe:
char *src, *dest;
src = (char *)malloc(BUFFSIZE); // no dereference on src, it's a pointer
//Do something to fill the src
mystringcpy(src, strlen(src), &dest); // pass the address of dest
// take a pointer to a char*
void mystringcopy(char *src, size_t length, char **dest) {
// now you should dereference dest, to assign to
// the char* that was passed in
*dest = (char *)malloc(length + 1);
// for simplicity, make an auxiliary dest
char* destAux = *dest;
// and now the code is the same
for(; (*destAux = *src) != '\0'; ++src, ++destAux);
}
Une autre méthode consiste à renvoyer le pointeur dest
:
char *src, *dest;
src = (char *)malloc(BUFFSIZE);
//Do something to fill the src
dest = mystringcpy(src, strlen(src)); // assign dest
char* mystringcopy(char *src, size_t length) {
char* dest = (char *)malloc(length + 1);
// for simplicity, make an auxiliary dest
char* destAux = dest;
for(; (*destAux = *src) != '\0'; ++src, ++destAux);
return dest; // give it back
}
Gardez à l'esprit si la longueur est plus petite que la longueur réelle du tampon source que vous envahie votre mémoire tampon de destination. Voir les commentaires pour une solution, même si cela vous appartient.
'* src = (char *) malloc (taille du buffer)' ne devrait pas avoir un chef de file '' *. – spoulson
Quelle est l'erreur? Pour une chose, mystringcopy n'est pas encore défini, sauf si vous avez un prototype quelque part. –
Oh son juste me donner une erreur de segmentation ... Je vais vérifier les autres solutions dans une seconde ... – Legend