تمرير المخزن المؤقت char إلى الوظائف والحصول على حجم المخزن المؤقت

StackOverflow https://stackoverflow.com/questions/609267

  •  03-07-2019
  •  | 
  •  

سؤال

لقد قمت بتعيين المخزن المؤقت إلى حجم 100.أعرض المخزن المؤقت في الوظيفة الرئيسية حيث يتم الإعلان عن المخزن المؤقت.ومع ذلك ، عندما أقوم بتمرير المخزن المؤقت إلى الوظيفة وأحصل على حجم "4" ، كنت أفكر أنه يجب أن يكون 100 ، لأن هذا هو حجم المخزن المؤقت الذي قمت بإنشائه بشكل رئيسي.انتاج:حجم المخزن المؤقت:100 sizeof (المخزن المؤقت):4

#include <string.h>
#include <stdio.h>

void load_buffer(char *buffer);

int main()
{
    char buffer[100];
    printf("buffer size: %d\n", sizeof(buffer));
    load_buffer(buffer);

    return 0;
}

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}
هل كانت مفيدة؟

المحلول

وأنت تستخدم حجم مؤشر إلى المخزن المؤقت (4 بايت)، بدلا من حجم المخزن المؤقت.

في C، لديك لتمرير حجم المخزن المؤقت على حدة، والتي هي جزء من السبب تجاوزات عازلة يحدث ذلك بسهولة وبشكل متكرر.

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}

نصائح أخرى

والأجوبة التي ميتش القمح وhhafez على حق تماما وإلى هذه النقطة. انا ذاهب الى اظهار بعض المعلومات الإضافية التي قد تكون مفيدة في بعض الأحيان.

لاحظ أن يحدث نفس الشيء إذا كنت اقول المترجم أن يكون لديك مجموعة من الحجم الصحيح

void load_buffer(char buffer[100]) {
    /* prints 4 too! */
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

وهناك مجموعة كمعلمة هو مجرد يعلن مؤشر. المترجم تتغير تلقائيا أن لchar *name حتى لو أعلنت أنها char name[N].

إذا كنت ترغب في فرض المتصلين لتمرير مجموعة من حجم 100 فقط، يمكنك قبول عنوان مجموعة (ونوع من ذلك) بدلا من ذلك:

void load_buffer(char (*buffer)[100]) {
    /* prints 100 */
    printf("sizeof(buffer): %d\n", sizeof(*buffer));
}

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

buffer[0][N] or (*buffer)[N]

لا أحد أنا أعرف يفعل ذلك، وأنا لا أفعل ذلك بنفسي، لأنه بدلا من تعقيد مرور ذي الحجة. ولكن من الجيد أن نعرف عن ذلك. يمكنك استدعاء الدالة مثل هذا ثم

load_buffer(&buffer)

إذا كنت ترغب في قبول أحجام أخرى أيضا، كنت اذهب مع خيار تمرير-N اثنين إجابات أخرى التوصية.

من البروتوكول الاختياري

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

على الرغم من أنه يمكنك تخيل ذلك load_buffer() تم تمرير buffer بالرجوع إليها، ما يحدث بالفعل هو أنك تقوم بتمرير مؤشر إلى char بواسطة قيمة. لم يتم تمرير المصفوفة الفعلية لذا لا توجد طريقة لـ load_buffer() وظيفة لمعرفة حجم مجموعة المخزن المؤقت

إذا ماذا sizeof(buffer) عمل؟إنه ببساطة يعيد حجم المؤشر إلى char.لو load_buffer() يحتاج حجم buffer يجب أن يتم تمريرها بشكل متقطع.

أو يمكنك إنشاء بنية جديدة تحتوي على كل من مصفوفة char وحجم المصفوفة، وتمرير مؤشر إلى تلك البنية بدلاً من ذلك، وبهذه الطريقة يكون المخزن المؤقت وحجمه معًا دائمًا؛)

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

وأفضل طريقة للحفاظ على حجم المخزن المؤقت في وظيفة هو لتغيير وظيفة إلى:

void load_buffer(char *buffer, int length);

ووالدعوة إلى:

load_buffer(buffer, sizeof(buffer));

ومن ثم استخدام طول كلما كنت تريد أن حجم المخزن المؤقت.

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