تؤدي كتابة DWORD إلى الذاكرة إلى الكتابة فوق بايت واحد فقط بدلاً من 4

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

  •  10-12-2019
  •  | 
  •  

سؤال

أملك

typedef unsigned int DWORD;

void write_str(string str, char** buf) {
    DWORD len = str.size();
    **buf = len;
    *buf += sizeof(len);
    memcpy(*buf, str.c_str(), len);
    *buf += len;
}

يتم الكتابة فوق هذا الرمز، وبايت واحد فقط **buf = len; إذا كان لدي أي.7 في لين بينما يجب أن يكون 4، لأن sizeof(DWORD) = 4

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

المحلول

مثل buf هو char **, **buf هو char.يمكنه استيعاب بايت واحد فقط.لذلك، تتم كتابة بايت واحد فقط إليه.

نصائح أخرى

يصلح:

DWORD *tmpptr(*buf);
*tmpptr = len;

يقوم C++ بإلقاء len تلقائيًا على حرف، لأن هذا هو ما *buf يكون.

لديك المعلمة

char** buf

وهذا يعني أن **buf هو شار، وهو على الأرجح بايت واحد.

تتم الكتابة فوق بايت واحد نظرًا لأن نوع الوجهة هو char (نوع **buf هو شار).هذا صحيح.لكن التعبير *buf += sizeof(len) ليس لها أي معنى في رأيي.

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