2010-02-09 3 views
1

J'utilise un char [] de taille 4 mais quand j'utilise la fonction memcpy(), il y stocke 8 caractères et aussi la longueur du tableau de caractères devient 8. Que se passe-t-il?Le tableau de caractères semble augmenter après memcpy(), quel est le problème?

Je ne veux pas utiliser malloc ok.

char strRoh[4]={'\0'}; 

puis

memcpy(strRoh,Dump+22,4); 

Maintenant, dites-moi ce qui est le problème avec cette

char strIP[]="hhhhhhhh"; 
char strRoh[4]={'\0'}; 
char strTheta[4]={'\0'}; 
char strTimeStamp[6]={'\0'}; 
char strNMDump[48]={'\0'}; 

est-il un problème avec décélérations parce que quand je change il y a ordre des chaînes changent aussi il taille maintenant strroh est en train d'obtenir 10 caractères

que diable se passe-t-il avec ce

+1

montre votre code. ne sois pas timide. – Kobi

+0

Pouvez-vous montrer le code en question? – SapphireSun

+0

Assurez-vous de copier la taille du tableau et non la taille du pointeur. – philant

Répondre

6

Les chaînes C sont terminées par 0. Cela signifie que si vous voulez avoir une chaîne de longueur n en C, vous devez n+1char s pour elle:

char hello[5] = "hello"; 

est pas une chaîne, car hello possède un espace pour 5 char s, et il n'a pas fin avec 0.

char hello[6] = "hello"; 

est une chaîne de caractères, et dispose de 6 caractères: h, e, l, l, o, 0.

Pour pouvoir utiliser les fonctions liées à la chaîne en C, vous devez la terminaison 0.

Donc, changer votre code pour avoir:

char strRoh[5]={'\0'}; 
char strTheta[5]={'\0'}; 
char strTimeStamp[7]={'\0'}; 
char strNMDump[49]={'\0'}; 

Notez que dans C, quand vous faites:

char hello[] = "hello"; 

le compilateur ne le comptage pour vous, et fait hello un tableau de taille 6 (une terminaison 0):

printf("%zu\n", sizeof hello); 

va imprimer 6.

+0

ok thanx je l'ai fait avant vous ans mais vous avez obtenu le point maintenant je prends la taille 5 au lieu de 4 mais la longueur de la chaîne est encore 4 et cela fonctionne pour moi toute la façon dont le problème est résolu. – Badr

3

Le type sous-jacent des objets pointés par les pointeurs source et de destination est sans importance pour memcpy; Le résultat est une copie binaire des données.

La fonction ne vérifie aucun caractère nul dans la source - elle copie toujours exactement les octets. Ma conjecture est que vous n'ajoutez pas de null et que vous essayez d'y accéder en tant que chaîne.

0

Je suppose que si char a 2 octets si vous memcpy à un tableau d'octets vous pourriez obtenir 8 octets, c'est 2 octets pour chaque char.

Je suis cependant rouillée à ce genre de choses en C/C++. Donc j'espère que quelqu'un avec plus d'expérience vous donnera une meilleure réponse.

1

C n'a aucune sorte de contrôle de limite sur ses types de données.

Donc ce que vous "voyez" probablement lors du débogage du code est qu'il vous montre 8 octets dans le tableau. Comme quelqu'un le dit, vous pourriez essayer de l'afficher sous la forme d'une chaîne et ne pas avoir un octet nul final. C'est tout à fait normal en C, et c'est l'un des aspects du langage qui le rend très difficile à comprendre.

Je vous recommande de lire une bonne introduction à la mémoire et la manipulation de pointeur sous C, ou passer à un langage managé comme C#, VB.NET, Java, Perl, Python, etc.

0

Le problème est que vous avez un tableau char de 4 octets et vous écrivez 4 octets complets pendant memcpy sans laisser d'espace pour le caractère nul de fin. Déclarez votre tableau en 5 octets et initialisez le tout à null (ce que vous faites déjà) et tout devrait bien se passer.

Questions connexes