![]() |
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| High Level Programming Posez vos questions à propos de C, C + +, Java, SQL, et d'autres langages de programmation ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| Quel niveau de base nécessaires Filesets par un programme spécifique? | cypher82 | UNIX for Advanced & Expert Users | 4 | 05-29-2008 08:07 AM |
| Besoin d'aide en ce qui concerne c programme | dwgi32 | High Level Programming | 2 | 11-19-2007 10:44 AM |
| Weird chose sur FS et VGS | mhenryj | AIX | 4 | 11-13-2007 04:42 PM |
| Weird résultats avec awk | amatheny | De programmation et de script Shell | 2 | 11-01-2007 06:12 PM |
| Message bizarre? | lesstjm | UNIX pour les nuls Questions et réponses | 6 | 01-04-2002 10:01 AM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread | Rate Thread | Modes d'affichage |
|
|
|
||||
|
Weird C programme. Help Needed
Salut,
S'il vous plaît voir ceci: Quand je faire une déclaration en tant que: char * i, j [15], * k; et puis sprintf (k, "print.sh% s", i); le programme fonctionne bien. Mais lorsque je change la déclaration: char * i, * k; et puis sprintf (k, "print.sh% s", i); Je obtenir une erreur de segmentation à la 'sprintf' déclaration. Le programme ne fonctionne que lorsque j est un tableau de 15. Rien de moins / plus ![]() S'il vous plaît la note: variable j est un mannequin. Je n'ai absolument rien avec elle. Aussi, je sais utiliser sprintf la manière que j'ai fait est illégal. Le pointeur n'est pas affectée à quelque chose, avant une telle déclaration. Il est stupide mai mais s'il vous plaît quelqu'un pourrait expliquer pourquoi cela se produit? Guess quelque chose à voir avec la façon dont la mémoire est allouée.Merci d'avance! |
|
||||
|
Vous essayez d'écrire à la mémoire aléatoire que "k" n'a pas été fait à rien. Le noyau peut vous donner trois réponses ...
(a) vous permettent de le faire (b) piège parce que vous êtes écrit à la mémoire en lecture seule, par exemple, le programme image (c) piège parce que vous écrivez à la mémoire qui n'a pas été attribué pour vous |
|
||||
|
Eh bien, sur les lignes ci-dessus, i pourrait déduire:
1. dans un cas, k est pointant vers la sortie standard (ne sais pas comment!), coz son contenu de la mémoire ont été celui de mon printf, avant la sprintf. (Surprenantes!) 2. Dans un cas, k pointait à la chaîne sprintf partie de ma déclaration. Ainsi encore, il n'est pas illégal, et le programme de travail. (Il semble possible). Toutefois, ce genre d'ordures initialisations valide, mais semblent se produire que lorsque la variable j est déclarée. Sinon, le programme bloque par SEGV. Mais je pense que c'est un spécial et unique cas. Devinez le même code ne fonctionne pas sur une autre machine. (Mine est Solaris). Les commentaires / entrées / une meilleure personne? |
|
||||
|
La pile principale est que l'aide ne sera pas épargné la mémoire vierge, elle aura été utilisée pour les appels de routine du programme prolog, c'est-à -dire crt0.o (ou autre) avant de main () d'être appelé.
La mémoire est vraiment dans un état inconnu, mais je prends votre point de vue sur le contenu devant être reproductibles sous certaines conditions. Je voudrais parler d'une affaire de déjà vu. ![]() |
|
||||
|
être d'accord
. Toutefois, dans répétées fonctionne, le programme variables sont attribués le même emplacement mémoire.Même à la lecture d'une chaîne très long (20 chars) et en l'envoyant à sprintf, il est surprenant comment il n'y a pas de segmentation fault. À un certain point, à moins que «k» est pointée sur la sortie standard, la longueur de la mémoire doit cause et, le programme doit obtenir SEGV droit? Aussi, si à tous les' k 'points de stdout, sur la façon de faire une chasse d'eau immédiatement, i devrait voir le contenu de «k» à droite? coz il pourrait écraser le contenu précédent de la sortie standard. |
|
||||
|
Citation:
Vous avez sous gdb et de voir où les choses sont vraiment? |
|
||||
|
Vous avez un problème dans les deux cas. L'un est pris, l'autre ne l'est pas.
"char * i, j [15], * k» dit le texte suivant: Point à la mémoire d'appel et que le pointeur i; Créer un espace dans la mémoire de tenir 15 caractères et d'appel que l'espace j; et le point d'appel à la mémoire et que le pointeur k; Lorsque vous essayez de faire "sprintf (k," print.sh% s ", i);" vous demandez à l'ordinateur de bâton de la chaîne "print.sh?" dans la mémoire à l'emplacement que vous avez fait avec le pointeur de la variable k. Votre problème est que vous n'avez pas alloué l'espace de tenir la corde à l'emplacement du pointeur de k, k est actuellement à peine à pointer certains aléatoire emplacement de mémoire et pas de l'espace a été alloué à organiser quelque chose à l'emplacement mémoire pointé par k. C'est la raison pour laquelle il meurt. La raison pour laquelle il doensn't mourir (encore) dans l'exemple où j est l'espace alloué, c'est qu'il ya au moins un espace alloué sur la pile, et k est probablement accidentellement pointant là , et à cet effet corrupteur j, mais pas provoquer un segv (encore). Je vous suggère d'aller étudier sur place les différences sur * k, k [10], k [10,10] et ** k. Lorsque vous avez compris ce que signifie ces différentes formes, vous êtes administrateur système auront une bien meilleure journée. |
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|