سؤال

والقادمة من جاوة أنا مرتبك من خلال استخدام الفراغ السماح لقيمة الإرجاع في ما يلي:

void *emalloc(size_t s) {  
    void *result = malloc(s);  
    if (NULL == result) {  
        fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");  
    exit( EXIT_FAILURE );  
    }  
    return result;  
}  

هل هذا يعود مؤشر إلى ظرف من تخصيص الذاكرة؟

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

المحلول

نعم، هو. A الفراغ * المؤشر هو في الأساس مؤشر عام لعنوان الذاكرة، والتي يمكن بعد ذلك عادة ما يتم التلبيس إلى أي نوع كان المطلوب فعلا.

نصائح أخرى

وسؤالك يدل على انك قراءة خاطئة نوع عودة الدالة. هناك فرق كبير بين:

void foo( void ) {}

و

void *bar( void ) {}

وفو () لا يأخذ الحجج ولا يرجع قيمة، في حين أن شريط () يأخذ بدون وسائط وإرجاع المؤشر العام. في C، يتم استخدام الفراغ الكلمة للإشارة إلى مؤشر عام، ويمكن تحويل كائن من نوع الفراغ * إلى أي نوع آخر مؤشر كائن دون فقدان المعلومات.

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

نعم. void* يعني مؤشر لشيء، ولكن لا يوجد نوع معين.

والفراغ يعني في الأساس ليست نوع، لذلك إذا كان لدينا باطلا * ع؛ ص هو مؤشر إلى شيء، لكننا لم يقل ما.

والفراغ دون مؤشر شيء وبالتالي فو باطل (الفراغ) كونها دالة التي تأخذ بدون وسائط وإرجاع أي شيء.

ونعم malloc بإرجاع المؤشر إلى بعض قطعة من الذاكرة، malloc لا يعرف أو يهتم ما هو نوع تلك الذاكرة لديه، لذلك فمن نوع إرجاع لاغية *

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

int* malloc(size_t size)
{
    //
}

وأنت من المحتمل الحصول على المؤشر، الذي هو في الأساس مؤشر إلى array. ثم لو كنت مؤشر عليه مثل المصفوفات العادية.

int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).

والمشكلة هي أن C لا يكون لها وظائف الحمولة الزائدة. لذلك، علينا أن نجد وسيلة لكتابة malloc عام. خلاف ذلك، وكنت في نهاية المطاف مع malloc مختلفة لكل نوع. الحل هو ارسال العدد المطلوب من وحدات البايت التي تحتاج إليها. ثم، يمكنك مؤشر كيفما تشاء. وهذا يعطي مرونة أكبر واحد للجميع حل.

int*  i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte

int  thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)

وهكذا، الفكرة كلها هي أن لا يهم كيف يمكننا مؤشر الذاكرة وصلنا من malloc. كل ما علينا القيام به هو تحديد نوع المصفوفة التي تم إنشاؤها حديثا إلى المؤشر بشكل صحيح. void* يعني أن هذا هو مؤشر لوضع في ذاكرة أننا لم تحدد كيفية المؤشر.

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