سؤال

لماذا n لا يساوي 8 في ما يلي وظيفة ؟

void foo(char cvalue[8])
{
  int n = sizeof (cvalue);
}

ولكن n لا يساوي 8 في هذا الإصدار من وظيفة:

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}
هل كانت مفيدة؟

المحلول

لا يمكنك تمرير صفائف بأكمله كما المعلمات وظيفة في C.أنت فعلا تمرير مؤشر إلى ذلك ؛ الأقواس هي النحوي السكر.لا توجد ضمانات مجموعة أنت لافتا إلى حجم 8, منذ كنت يمكن أن تمر هذه الوظيفة أي حرف المؤشر تريد.

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)

نصائح أخرى

C و C++ المصفوفات ليست من الدرجة الأولى الأجسام ؛ لا يمكن تمرير صفائف وظائف, هم دائما تسوس إلى مؤشرات.

ومع ذلك ، يمكنك تمرير مؤشرات وإشارات إلى صفائف.هذا يمنع حدود مجموعة من المتحللة.لذلك هذا هو قانوني:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}

في المثال الأول ، الخاصة بك كما مرت المعلمة هي في الحقيقة مجرد مؤشر إلى صفيف حرف و عندما تأخذ sizeof() من ذلك ، يمكنك الحصول على حجم المؤشر.في الحالة الثانية ، حيث كنت قد أعلنت أنها متغير محلي ، يمكنك الحصول على حجم مجموعة كاملة.

حجم المعلمة على أنظمة 32 بت سوف تكون 4 و على أنظمة 64 بت جمعت مع -m64 سيتم 8.هذا هو لأنه يتم تمرير صفائف كما المؤشرات في الوظائف.المؤشر هو مجرد عنوان الذاكرة.

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