ما هو حجم الذاكرة منطقة وأشار إلى غير موقعة تشار *?

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

  •  10-07-2019
  •  | 
  •  

سؤال

أعلم أن هذا تم طرحها من قبل ولكن بعد البحث لم أجد الجواب الصحيح.

أنا في حاجة لتحويل منطقة عازلة (unsigned char *) إلى base64, base64 وظيفة أنا باستخدام يأخذ paramters:

void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)

حيث int srclen هي طول src السلسلة.

سؤالي هو كيف يمكنني الحصول على طول المخزن المؤقت.لا إنها ليست فارغة إنهاء.لا, أنا لا أريد sizeof(BYTE).أريد فقط أن أعرف ما تمر كما srclen لذا يمكن تحويل هذه العازلة إلى base64.

تحرير:

هنا بعض التعليمات البرمجية التي تظهر ما أقوم به:

unsigned char *pBytes;
unsigned char *B64Encoded;
int b64size = 0;

if (pBytes = (unsigned char *) GlobalLock(hMem))
{
    DWORD size = (DWORD)GlobalSize(hMem);
    b64size = size / sizeof(unsigned char);
    Base64Enc(pBytes, b64size, B64Encoded);

    // in this case save the buffer to a file just for testing
    if (fp = fopen("ububub.txt", "wb"))
    {   
        printf("data: %s\n", B64Encoded);
        fwrite(B64Encoded, strlen(B64Encoded), 1, fp);
        fclose(fp);
    }
}
هل كانت مفيدة؟

المحلول

إذا لم تكن فارغة إنهاء أو شيء-إنهاء الطريقة الوحيدة لمعرفة حجم لتتبع عندما حصلت لأول مرة.

كيف يمكنك الحصول على العازلة في المقام الأول ؟ أيا كان ذلك ربما يعطي لك طريقة أيضا الحصول على طول المخزن المؤقت.

تحرير

التعليق:

لدي حجم الذاكرة التي يأخذ البيانات.حاولت اللعب مع أن ولكن ليس من الصحيح المعلومات على ما يبدو.

في هذه الحالة تأخذ الخام حجم وتقسيمها حسب حجم كل عنصر للحصول على عدد من العناصر:

unsigned numelem = size / sizeof(unsigned char)

شكرا تود غاردنر لافتا أن sizeof(char غير الموقعة) هو يحددها معيار أن يكون 1 ، لذلك عدد من العناصر في المخزن الخاص بك هو فقط مقدار المساحة العازلة الخاصة بك يستخدم.

"تقسيم حسب حجم العنصر" هو أعم حل أي نوع من عنصر.

نصائح أخرى

ومما يؤسف له أن هناك في الحقيقة ليست إجابة عامة على هذا السؤال. في C / C ++ أنه ليس من الممكن ببساطة معرفة عدد عناصر نقاط مؤشر خاصة. وتقع على عاتق من التعليمات البرمجية التي تحافظ على مؤشر للحفاظ على هذه المعرفة.

وسيكون لديك لترابط هذه المعلومات من خلال من أقرب نقطة حيث كنت لا تعرف حجم المؤشر.

if (pBytes = (unsigned char *) GlobalLock(hMem))

في هذه الحالة لديك hMem مؤشر إلى كتلة ذاكرة عمومية. يجب أن يكون قد تم الحصول عليها هذا المؤشر بواسطة استدعاء GlobalAlloc () أو GlobalReAlloc (). عندما صنع واحدة من هذه الدعوات يجب أن يكون على علم حجم الذاكرة. وهذا هو طول من بايت كنت تبحث عنه.

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

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