لا يمكن حفظ قيمة الإرجاع strlen
-
28-10-2019 - |
سؤال
أنا أستخدم وظيفة 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.
إذا كنت تريد معرفة السبب الدقيق، فسوف تحتاج إلى إلقاء نظرة على كود المجمع الذي ينشئه المجمع الخاص بك.لكن هذا لن يخبرك بأي شيء مفيد.