سؤال

ولدي مشكلة مع وظيفة realloc في C. أنا تمرير لك شفرة رفع الصوت عاليا:

typedef struct _Pool Pool;
typedef struct _Item Item;

struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};

struct _Item {
    char * file; 
    unsigned int lenOfFilePath;
    unsigned int x;
};

void Pool_insert(Pool ** pool, Item * item)
{       
    if ((*pool)->itemsCount + 1 == (*pool)->poolSize)
    {
        (*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;
        if (!(*pool)->items) return;
        (*pool)->poolSize += (*pool)->poolStep;
    }

    (*pool)->items[(*pool)->itemsCount++] = item;
}

وأنا لا إرسال رمز تخصيص الأول ولكن إذا كنت زيادة عدد العناصر التي أنا باستخدام هناك شيء يعمل بشكل جيد. عندما أدعو realloc انني اتلقى هذا الخطأ:

<اقتباس فقرة>   

وmalloc: *** خطأ ل0x19dba8 الكائن:   وكان مؤشر يتم تخصيص لا   تخصيص

وأرجو مساعدتي في حل مشكلتي؟


وهنا هو الأسلوب إنشاء لبركة:

void Pool_create(Pool ** pool, unsigned int poolSize)
{   
    unsigned int poolMemSize = sizeof(Pool) + sizeof(Item *)*poolSize;
    *pool = malloc(poolMemSize);
    if (!*pool) return;
    memset(*pool,0,poolMemSize);

    (*pool)->itemsCount = 0;
    (*pool)->poolSize = poolSize;
    (*pool)->poolStep = POOL_STEP;

    (*pool)->items = (Item **)((char*)(*pool) + sizeof(Pool));
    if(!(*pool)->items) return;
    memset((*pool)->items, 0, sizeof(Item *) * poolSize);
}

وكما قلت، إذا كنت تريد على سبيل المثال إدراج 1000 الأصناف وتخصيص الذاكرة عن طريق إنشاء وظيفة بعد ذلك كل شيء يعمل بشكل جيد إذا أعلن بدء بركة حجم 100 العناصر ومن ثم أريد أن realloc عناصر أحصل على خطأ.

وشكرا جزيلا على هذه الإجابة السريعة.

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

المحلول

ولكن (*pool)->items تم تخصيص أبدا! يمكنك تخصيص فقط (*pool) - شريحة كاملة من الذاكرة. يجب أن كنت قد استخدمت اثنين mallocs في هذه الحالة - واحد لهيكل الرقابة (بركة) وواحدة للعناصر * مجموعة.

وتوضيح: لا يمكنك realloc <م> الجزء من الذاكرة المخصصة - فقط قطعة malloc'ed بأكملها. لاحظ أيضا أنه يجب اختبار نتيجة realloc أولا، قبل استبدال مؤشر الأصلي في قانون مكتوب بشكل جيد - وإلا إذا فشلت realloc تخسر كتلة الذاكرة المخصصة سابقا

نصائح أخرى

struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};
<اقتباس فقرة>   

وmalloc: *** خطأ ل0x19dba8 الكائن:   وكان مؤشر يتم تخصيص لا   تخصيص

هل تخصيص الذاكرة للبنود ذات malloc؟ يبدو أن الرسالة إلى أن نقول أنك لا. وينبغي أن تستخدم Realloc عن الذاكرة المخصصة مع malloc - مثل وظائف

(*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;

لمزيد من المساعدة، وتبين لنا كيف يمكنك تهيئة العناصر.

وربما كنت نسيت أن تهيئة العناصر * في هيكل وتطارد مؤشر البرية.

وهنا هو الأسلوب إنشاء لبركة:

void Pool_create(Pool ** pool, unsigned int poolSize)
{   
    unsigned int poolMemSize = sizeof(Pool) + sizeof(Item *)*poolSize;
    *pool = malloc(poolMemSize);
    if (!*pool) return;
    memset(*pool,0,poolMemSize);

    (*pool)->itemsCount = 0;
    (*pool)->poolSize = poolSize;
    (*pool)->poolStep = POOL_STEP;

    (*pool)->items = (Item **)((char*)(*pool) + sizeof(Pool));
    if(!(*pool)->items) return;
    memset((*pool)->items, 0, sizeof(Item *) * poolSize);
}

وكما قلت، إذا كنت تريد على سبيل المثال إدراج 1000 الأصناف وتخصيص الذاكرة عن طريق إنشاء وظيفة بعد ذلك كل شيء يعمل بشكل جيد إذا أعلن بدء بركة حجم 100 العناصر ومن ثم أريد أن realloc عناصر أحصل على خطأ.

شكرا جزيلا على هذه إجابة سريعة لك.

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