2016-11-07 1 views
0

Je suis sûr que la question suivante a été beaucoup posée, mais je vais demander btw parce que je n'ai pas encore trouvé la réponse.vérifier la taille du tampon/strncpy

Je dois recréer la fonction strncpy (je n'ai besoin d'aucune solution à ce sujet) et je ne peux pas reproduire un comportement exact de cette fonction.

Ceci est mon code:

int main(void) 

{ 

    char dest1[15]; 

    char dest2[15]; 

    char *src = "abcdefgh"; 

    size_t n = 16; 

    putstr(strncpy(dest1, src, n); 
// the output is : [1] 23975 abort  ./a.out 

    putstr(ft_strncpy(dest2, src, n); 
// the output is : abcde[1] 23975 abort  ./a.out 

    return (0); 

} 

Je pense que la fonction strncpy vérifier la taille de la mémoire tampon de dest1 et le comparer avec n avant que quelque chose de retour.

La fonction ft_strncpy est ma fonction, la copie de strncpy.

Comment puis-je vérifier la taille du tampon dest2 dans ma fonction? Cela n'a pas fonctionné avec dest2 ++ (boucle infinie) ou dest2 [index] (return 0);

Modifier: Suppression des étoiles de dest1 ans dest2. Et une explication supplémentaire de ce qu'est ft_strncpy.

+3

Le code que vous montrez est problématique, non pas parce qu'il y a un problème avec la fonction 'strncpy', mais avec les deux tableaux. Vous avez deux tableaux de * pointeurs * à 'char'. En d'autres termes, vous n'avez pas deux tableaux qui peuvent être utilisés comme chaîne, mais deux tableaux * de * chaînes (ou plutôt des chaînes potentielles). –

+0

arf, exactement ... grosse erreur. Je vous remercie ! –

+0

ok, donc c'est char dest [15] dans mon code, mauvaise copie de moi. Désolé –

Répondre

1

En premier lieu, dest1 et dest2, étant des tableaux de type char *, wen passés à la fonction en tant qu'argument, déclinent en l'adresse du premier élément du tableau.

Maintenant, le problème ici est, le premier élément est le pointeur initialisés (sauvage) et toute tentative d'accéder à la mémoire pointée par ce pointeur invoque undefined behavior.

Vous devez vous assurer que les éléments du tableau pointent vers une mémoire valide avant de les déréférencer (les utiliser).

Cela dit,

Comment puis-je vérifier la taille du tampon dest2 dans ma fonction

Eh bien, vous ne le faites pas. Selon l'exigence, strncpy() ne fait pas cela. En outre, vous ne pouvez pas faire cela à partir du pointeur seul, vous devez garder la trace de la taille de la mémoire allouée vous-même, ce n'est pas directement déductible d'un pointeur.

+0

Très bien, merci. –

3

En ce qui concerne votre problème. Vous ne pouvez pas vérifier la taille de la destination. Tout ce que vous avez est un pointeur, et rien de plus. Vous devez compter sur la chaîne source ou la longueur étant plus petite que la mémoire vers laquelle pointe le pointeur de destination.

N'oubliez pas non plus que vous ne pouvez pas compter sur le contenu de la destination. Son contenu peut ne pas être initialisé et être indéterminé. Les tableaux ou la mémoire en général n'ont pas de terminateur. Le terminateur de chaîne est une convention , et non quelque chose qui est appliqué par le langage.

+0

Ok, merci pour l'information! –