سؤال

أنا أستخدم وظيفة Strlen الخاصة بمكتبة C string. لقد مررت بسلسلة خالية منها ووجدت نتيجة غامضة

main()
{
  int k;
  char *s=NULL;
  strlen(s);
  // k = strlen(s);
}

في برنامج التحويل البرمجي الخاص بدول مجلس التعاون الخليجي، فإنه يعمل بشكل جيد مع التعليق.ولكن إذا كنت سوف إزالة التعليق في السطرk=strlen(s);

وتنتج خطأ تجزئة.أي تفسير؟

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

المحلول

هذا هو رمز المجمع بدون تعيين للمتغير int

movq    $0, -16(%rbp)
movl    $0, %eax
leave
ret

لا يقوم المترجم باستدعاء _strlen لأنه لن يتم استخدام القيمة

نصائح أخرى

من المحتمل أن يتم تحسين استدعاء "strlen" الأول الذي لا يقوم بتعيين قيمة الإرجاع الخاصة به بواسطة برنامج التحويل البرمجي الخاص بك.

تمرير مؤشر فارغ إلى strlen النتائج في سلوك غير محدد. أي شيء يمكن أن يحدث. بما في ذلك أخطاء seg.وبما في ذلك عدم وجود أخطاء SEG.

إذا كنت تريد معرفة السبب الدقيق، فسوف تحتاج إلى إلقاء نظرة على كود المجمع الذي ينشئه المجمع الخاص بك.لكن هذا لن يخبرك بأي شيء مفيد.

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