سؤال

وجود بعض المشكلات مع C. لدي هذا هو رمزي:

// First line works, second line does not! 
char outbuf[1024];
// char *outbuf = (char *) malloc(1024);  // char is always 1

أنا أتخلى عن هذا Outbuf إلى طريقة تسمى PK11_CipherOp(), أعلن في مكتبة NSS. يمكن العثور على الوثائق لهذه الطريقة هنا, ، يمكنك أن ترى أنه يتوقع char * بالنسبة لمعلمة Outbuf.

لا أستطيع أن أفهم لماذا يعمل السطر الأول بشكل موثوق، والسطر الثاني لا!

لرؤية الكود الكامل، يرجى الاطلاع مصدر الملف

شكرا،

هاميلتون

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

المحلول

يبدو أن مشكلتك إعلان مفقود malloc - أنت لم تدرج <stdlib.h>.

هذا يعني أن برنامج التحويل البرمجي الخاص بك يفترض عوائد الوظيفة int, ، والتي هي ثم يلقي صراحة (unsigned char *). وبعد إذا كنت على منصة حيث sizeof(int) != sizeof(void *), ، مثل x86-64، ثم هذا سوف يتلوى قيمة المؤشر.

هذا يوضح تماما لماذا في C (على عكس C ++) يجب عليك ليس يلقي نتيجة malloc() - القيام بذلك غير ضروري، ويخفي هذا الخطأ الدقيق منك. كما يوضح سبب تشغيل تحذيرات المحول البرمجي.

الإصلاح هو #include <stdlib.h>, ، وإزالة الممثلين من malloc() بينما كنت هناك.

إضافة:

مشكلتك الأخرى هي أنك تمر sizeof(outbuf) ل PK11_CipherOp(). وبعد سيكون هذا صحيحا (يساوي out_buf_size) متي outbuf هو صفيف، ولكن غير صحيح (حجم مؤشر نفسه) متي outbuf هو مؤشر.

استبدال كل منها sizeof(outbuf) مع out_buf_size ويجب أن تكون جيدا للذهاب (هناك واحدة أخرى لاحقا جدا) ...

نصائح أخرى

وجدت القضية. اتضح أنني كنت أستخدم sizeof(outbuf) كواحدة من المعلمات. عندما يتم الإعلان عن Outbuf على المكدس، كما char outbuf[1024]; هذا يعود 1024. ومع ذلك، عندما يكون Outbuf على كومة char * outbuf = malloc(1024); حجم Outbuf هو فقط 4. أخبرت هذه المعلمة الوظيفة التي كانت مساحة متوفرة في Outbuf، لذلك اعتقدت الوظيفة أنه كان لديه فقط 4 بايت من الغرفة. يحتاج 16 للقيام به اي شى لذلك عاد فقط دون أداء أي عمل.

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