Fournir une chaîne qui n'est pas une valeur null à la fonction strcpy
Voici le code
smem_dmp(char *name, char content[])
{
int i;
int len = strlen(content);
printf("%s\n\n", name);
for(i = 0; i < len; i++)
{
printf("%c\t%p\n", content[i], &content[i] );
}
printf("Done\n\n");
}
print_bar()
{
printf("********************************************************************\n");
}
int main(int argc, char *argv[])
{
char a[16];
char b[16];
strcpy(a, "abcdefghijklmnop");
printf("a = %s\nb = %s\n\n",a,b);
smem_dmp("A", a);
smem_dmp("B", b);
print_bar();
strcpy(b, "ABCDEFGHILKLMNOP");
printf("a = %s\nb = %s\n\n",a,b);
smem_dmp("A", a);
smem_dmp("B", b);
system("PAUSE");
return 0;
}
De regarder où a et b résident en mémoire, j'ai travaillé sur ce qui se passe. La chaîne copiée à b n'est pas null. C'est la cause du contenu d'un être enlevé parce que b est situé à (0028FF20) avant un en mémoire (0028FF30).
Ce qui se passe? Ne strcpy(b,"string") de ne pas s'arrêter jusqu'à ce qu'elle a traversé toute la mémoire sur le frame de pile variables? Désolé si je ne suis pas en utilisant la bonne terminologie. 🙂
Votre tableau
Merci. Je sais. C'est plus sur le fonctionnement de la sécurité de la fixation de code.
Oui, il va les garder sur la copie des octets jusqu'à ce qu'il arrive à zéro octet en ce que la mémoire vive de l'accès aux ou il atteint inaccessable mémoire et provoque un défaut de mémoire. Si la mise en page comme vous le dites, il finira par écrire toutes sur l'autre chaîne, si il y arrive avant qu'il se bloque. Rien de cela n'est défini par aucune norme si, c'est juste ce qu'commun des implémentations de le faire.
a
est trop petit. Il a besoin d'au moins 17 éléments.Merci. Je sais. C'est plus sur le fonctionnement de la sécurité de la fixation de code.
Oui, il va les garder sur la copie des octets jusqu'à ce qu'il arrive à zéro octet en ce que la mémoire vive de l'accès aux ou il atteint inaccessable mémoire et provoque un défaut de mémoire. Si la mise en page comme vous le dites, il finira par écrire toutes sur l'autre chaîne, si il y arrive avant qu'il se bloque. Rien de cela n'est défini par aucune norme si, c'est juste ce qu'commun des implémentations de le faire.
OriginalL'auteur user84628 | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
strcpy
copies octets jusqu'à ce qu'il trouve un 0 octet dans la source. Qui est copié à la destination, puisstrcpy
retourne. (Si la destination n'est pas assez grand pour contenir la source, y compris le 0-terminator, le comportement est indéfini, mais sauf si vous obtenez une erreur de segmentation, c'est ce que, dans la pratique, vous pouvez compter sur passe.)Donc
des copies de 17 octets - le 16 lettres et le 0-terminator - à partir de la chaîne littérale de la matrice
b
, qui ne contient 16 éléments. Cela signifie que le 0-terminator est écrit l'un des éléments-delà de la fin de la matriceb
. Dans votre situation, c'est le premier octet dansa
, et lastrcpy(b, "ABCDEFGHIJKLMNOP");
rend effectivementa
contiennent une chaîne vide.OriginalL'auteur Daniel Fischer
la taille de
"abcdefghijklmnop"
est 16 et la taille de votrea
tableau est de 16 ans, il devrait être de 17 (16 + 1 terminateur null charachter)OriginalL'auteur MOHAMED