سؤال

وأنا أعلم أن الطريق الصحيح مقارنة "السلاسل" في C باستخدام strcmp, ولكن الآن حاولت مقارنة بعض الحرف المصفوفات مع == المشغل ، وحصلت على بعض نتائج غريبة.

نلقي نظرة على التعليمات البرمجية التالية:

int main()
{
    char *s1 = "Andreas";
    char *s2 = "Andreas";

    char s3[] = "Andreas";
    char s4[] = "Andreas";

    char *s5 = "Hello";

    printf("%d\n", s1 == s2); //1
    printf("%d\n", s3 == s4); //0
    printf("%d\n", s1 == s5); //0
}

أول printf طباعة بشكل صحيح 1, ، مما يشير إلى أنها ليست متساوية.ولكن يمكن للشخص أن يفسر لي لماذا, عندما يقارن الحرف المصفوفات ، == هو العودة 0 ?

هل يمكن لأحد أن يشرح لي لماذا أول printf هو العودة 1 (أي أنها متساوية) و الحرف المصفوفات هي العودة 0 ?

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

المحلول

وو== هو المقارنة بين عنوان الذاكرة.
فمن المحتمل أن المترجم الخاص بك يجعل S1 و S2 نقطة لنفس بيانات ثابتة لتوفير مساحة.

وأي. و"أندرياس" في أول سطرين من التعليمات البرمجية يتم تخزين البيانات في تنفيذ الخاص بك. يقول معيار C هذه السلاسل ثابتة وهكذا فقد optomized مؤشرات اثنين للإشارة إلى نفس التخزين.

ووشار [] خطوط خلق متغير عن طريق نسخ البيانات إلى متغير وهكذا يتم تخزينها في عنوان مختلف على المكدس أثناء التنفيذ.

نصائح أخرى

واه ... عندما يطبع == 1، وهو ما يعني أنها <م> هي على قدم المساواة. انها مختلفة من strcmp، والتي ترجع النظام النسبي من السلاسل.

وأنت تقارن عناوين وليس السلاسل. أول هما مستمر وسيتم إنشاء مرة واحدة فقط.

int main()
{
    char *s1 = "Andreas";
    char *s2 = "Andreas";

    char s3[] = "Andreas";
    char s4[] = "Andreas";

    char *s5 = "Hello";

    printf("%d\n", s1 == s2); //1
    printf("%p == %p\n", s1, s2);
    printf("%d\n", s3 == s4); //0
    printf("%p != %p\n", s3, s4);
    printf("%d\n", s1 == s5); //0
    printf("%p != %p\n", s1, s5);
}

والناتج على جهاز الكمبيوتر الخاص بي، ولكن تحصل على هذه الفكرة:

1
0x1fd8 == 0x1fd8
0
0xbffff8fc != 0xbffff8f4
0
0x1fd8 != 0x1fe0

وانتظر ثانية ... 1 يعني صحيح، 0 يعني كاذبة. لذلك التفسير الخاص بك هو جزئيا إلى الوراء. أما لماذا يبدو أن السلسلتين الأولى لتكون مساوية: المترجم بنيت هذه السلسلة المستمرة (S1 / 2) مرة واحدة فقط

.

وs1 == s2 يعني "(char*) == (char*)" أو أن العناوين هي نفسها.

ونفس الشيء بالنسبة لs3 == s4. هذا هو " صفائف تسوس إلى مؤشرات " في العمل .

وكان لديك معنى نتيجة الخطأ المقارنة:

0 == 0; /* true; 1 */
42 == 0; /* false; 0 */
"foo" == "bar"; /* false (the addresses are different); 0 */

كل القيم من s1 خلال s5 لا شار أنفسهم, أنهم المؤشرات إلى شار.إذا ما كنت مقارنة هي عناوين الذاكرة من كل سلسلة ، بدلا من السلاسل نفسها.

إذا قمت بعرض عناوين وهكذا يمكنك أن ترى ما عوامل المقارنة هي في الواقع تعمل على:

#include <stdio.h>

int main() {
  char *s1 = "Andreas";
  char *s2 = "Andreas";

  char s3[] = "Andreas";
  char s4[] = "Andreas";

  char *s5 = "Hello";

  printf("%p\n", s1); // 0x80484d0
  printf("%p\n", s2); // 0x80484d0
  printf("%p\n", s3); // 0xbfef9280
  printf("%p\n", s4); // 0xbfef9278
  printf("%p\n", s5); // 0x80484d8
}

بالضبط أين السلاسل المخصصة في الذاكرة تنفيذ محددة.في هذه الحالة, s1 و s2 تشير إلى نفس ثابت كتلة الذاكرة ، ولكن لا أتوقع أن السلوك المحمولة.

وأنت لا يمكن المقارنة بين السلاسل، ولكن يمكنك مقارنة المؤشرات.

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