la copie des données dans le tableau à l'aide de memcpy
#include <stdio.h>
int main(){
int a[4];
int b[4],i;
a[0] = 4;
a[1] = 3;
a[2] = 2;
a[3] = 1;
memcpy(&b, &a, sizeof(a));
for (i = 0; i < 4; i++){
printf("b[%d]:%d",i,b[i]);
}
printf("%d",sizeof(b));
}
ANS:
b[0]:4b[1]:3b[2]:2b[3]:116
Exited: ExitFailure 2
Je reçois les réponses correctes. Mais l'acquisition d'une exception en tant que Sortie: ExitFailure 2.
Est de cette manière que de la copie de la matrice de données à l'aide de memcpy est mal?
Essayez d'ajouter un
Vous utilisez
Vous êtes correct. Je suis en cours d'exécution dans le codepad.org. donc je n'ai pas obtenez des messages d'erreur pour le manque de valeur de retour.
k, je vais faire une réponse.
Le
return 0;
à la fin.Vous utilisez
memcpy
sorte de mal ici, vous n'avez pas besoin de l'adresse de l'opérateur (&
) tableau-de-type est compatible avec le pointeur de type, de sorte memcpy(b, a, sizeof(a));
est assez.Vous êtes correct. Je suis en cours d'exécution dans le codepad.org. donc je n'ai pas obtenez des messages d'erreur pour le manque de valeur de retour.
k, je vais faire une réponse.
Le
&
est facultative pour les tableaux. Je laisse toujours. Mais pour les pointeurs, c'est évidemment différent.OriginalL'auteur Angus | 2012-07-13
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter un
return 0;
à la fin demain()
.L'omission de la valeur de retour est probablement à l'origine de la fonction de retour de la pile d'ordures. (ce n'est pas 0)
L'appli de test/script est donc de se plaindre d'échec quand il voit un non-zéro de la valeur de retour.
Avant C99, en omettant le
return
déclaration est techniquement un comportement indéfini. À partir de C99, il sera par défaut à0
si elle est omise.Plus de détails ici: Pourquoi principaux ne renvoie pas 0 ici?
printf
, qui est de 2.Ouais, en supposant que le même registre/pile-l'emplacement est de tenir la valeur de retour des restes de la
printf()
. Qui il sera sur x86 et x64.Yep, donc "probablement".
OriginalL'auteur Mysticial
Correction:
Pas explicitement de retour 0 (
return 0;
) conduit àundefined behaviour
avantC99
.Toutefois, étant donné qu'un registre est généralement utilisé pour stocker une valeur de retour (par exemple
eax
dansx86
) à partir d'une fonction, la valeur de ce registre est retourné.Il se trouve simplement que
printf("%d",sizeof(b));
est le stockage de la taille de lachar
tableau dans le même registre, qui est utilisé pour le retour d'une valeur à partir d'une fonction.De ce fait, la valeur retournée est
2
.Réponse originale à cette question:
Puisque vous n'avez pas l'état
return 0;
à la fin de la main, de la dernièreprintf
appel est interprétée comme la valeur de retour de main.sizeof(b)
retourne16
qui est2
caractères, ainsi, le programme retourne2
comme code de sortie.Tu veux dire que le
printf
valeur est d'ailleurs stocké dans%rax
(sur x86 par exemple) et c'est pourquoi il retourne2
dans ce cas?Oui. Tout à fait exact.
J'ai mis à jour ma réponse en conséquence
OriginalL'auteur Man of One Way
Il y a un problème dans votre memcpy déclaration.
1) Vous devez passer le pointeur de votre tableau à la place vous êtes de passage du pointeur de pointeur de
votre tableau.
2) Vous devez passer à la taille de votre tableau, sizeof(a) sera de retour que la taille d'un int, donc u ont à
multiplier avec max indice de tableau.
Que vous avez à faire peu de modification dans votre code comme indiqué ci-dessous,
memcpy(b, a, sizeof(a) * 4);
OriginalL'auteur Kinjal Patel