The UNIX and Linux Forums  
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > High Level Programming
.
google unix.com



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

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 11-14-2007
karthikb23 karthikb23 is offline
Registered User
  
 

Join Date: Nov 2007
Posts: 18
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!
  #2 (permalink)  
Old 11-14-2007
porteur porter is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2007
Messages: 2965
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
  #3 (permalink)  
Old 11-14-2007
karthikb23 karthikb23 is offline
Registered User
  
 

Join Date: Nov 2007
Posts: 18
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?
  #4 (permalink)  
Old 11-14-2007
porteur porter is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2007
Messages: 2965
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.
  #5 (permalink)  
Old 11-14-2007
karthikb23 karthikb23 is offline
Registered User
  
 

Join Date: Nov 2007
Posts: 18
ê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.
  #6 (permalink)  
Old 11-14-2007
porteur porter is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2007
Messages: 2965
Citation:
Posté par karthikb23 View Post
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.
Essayez de voir ...?

Vous avez sous gdb et de voir où les choses sont vraiment?
  #7 (permalink)  
Old 11-14-2007
n1djs n1djs is offline
Registered User
  
 

Join Date: Nov 2007
Posts: 12
Smile Weird C programme. Help Needed

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.
Closed Thread

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 12:56 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0