سؤال

لقد لاحظت أنه في بعض الأحيان في البرامج C، إذا كان لدينا printf في التعليمات البرمجية في أي مكان قبل خطأ تجزئة، فإنه لا يطبع. لماذا هو كذلك؟

هل كانت مفيدة؟

المحلول

هذا لأن الإخراج من printf() مخزن مؤقتا. يمكنك إضافة. fflush(stdout); مباشرة بعد الخاص بك printf وسوف تطبع.

كما يمكنك القيام بذلك:

fprintf(stderr, "error string");

حيث stderr ليس مخزنة.

هناك أيضا سؤال ذي صلة.

نصائح أخرى

إذا حدث خطأ تجزئة في وقت مبكر جدا بعد طباعة الطباعة، فلن يتم مسح المخزن المؤقت الإخراج، فلن ترى تأثير Printf.

معظم تطبيقات LIBC PRINTF الإخراج المخزن المؤقت. عادة ما تكون كافية لإلحاق جديد ( n) بسلسلة الإخراج لإجبارها على تدفق محتويات المخازن المؤقتة.

يمكنك مسح المخزن المؤقت الإخراج مباشرة بعد الطباعة إلى التأكد من حدوثه قبل خطأ SEG. على سبيل المثال fflush (stdout)

نصيحة عشوائية: إذا كنت تحاول تصحيح أخطاء تجزئة، فتأكد من المحاولة valgrind.. وبعد يجعلها أسهل بكثير!

لقد حصلت على عدد من الإجابات التي تشير إلى التخزين المؤقت لتيار الإخراج.

للأفضل أو الأسوأ، لا يوجد مكان قريب من الاحتمال الوحيد. خطأ تجزئة يعني اكتشاف نظام التشغيل أنك قمت بعمل شيء خاطئ، ويتم كتابته عادة خارج الذاكرة المخصصة. للأفضل أو أسوأ (في الغالب أسوأ) القيام تقريبا اي شى في مثل هذه الحالة، يمكن أن يتغير ما يكفي من البرنامج الذي يقوم به البرنامج داخليا لمنع الكشف عن المشكلة، على الأقل في ذلك الوقت / في الموقف الذي تم فيه اكتشافه سابقا.

على سبيل المثال، قد يكون خطأ القطاع ناتج عن الكتابة من خلال مؤشر غير مهم - حدث ذلك لعقد قيمة معينة (ربما بعض عدد صحيح صغير) لأن الوظيفة التي تتصل بها سابقا تركت هذه القيمة في المكان الصحيح على المكدس عند استدعاء الوظيفة اللاحقة، واستخدمت نفس القيمة كأشر، فهي (معقولة) تحتوي على قيمة تم اكتشاف نظام التشغيل كمكان لم يسمح لك بالكتابة. ومع ذلك، قد يعني وضع مكالمة إلى Printf، ومع ذلك، فقد تعني أنك تترك بعض قيمة مختلفة تماما في المكان على المكدس الذي تستخدمه دون تهيئة. ما زلت تكتب في مكان ما، لكن قد يكون الآن في مكان ما لا يوجد نظام التشغيل أعرف يجب أن لا تكتب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top