Вопрос по c – Реализация Realloc в C

2
int getmin(int a, int b)
{
    return a<b?a:b;
}


void *reallocation(void *ptr, size_t size) //size_t in bytes
{

    void *newptr;


    int msize;
    msize = getsize(ptr);

    msize = getmin(msize, size);

        printf("msize = %d", msize);

    newptr = malloc(size);
    newptr = memcpy(newptr, ptr, msize);
    free(ptr);


    return newptr;

}

Я реализовал свой собственный realloc, и для того, чтобы получить размер выделенной памяти, используя malloc (однако я знаю, что нет никакого способа для этого в c).

Моя функция перераспределения работает нормально в моей системе Как мы получаем размер памяти, выделенной функцией malloc ().

Также можем ли мы сделать перераспределение на месте, если размер ранее выделенной памяти больше требуемой новой?

Какова ваша общая цель? Ты просто переписываешьrealloc или вы пытаетесь создать целый набор процедур выделения памяти? Steven Burnap

Ваш Ответ

3   ответа
1

the memory allocated by malloc gets initialized to zero, so i am checking for that condition.

Это неверно. Из проекта:

Description

2 The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate.

Вашgetsize должен быть исправлен.

My reallocation function is working fine.

Вы даже не исправляете выравнивание - оно может потерпеть неудачу для определенных типов. Читатьэтот ТАК вопрос.

Also can we do inplace reallocation if the size of the previously allocated memory is greater than the new required?

Что быin-place reallocation имею в виду? Разве это не простой запрет?

@Luv: см. Редактирование моего ответа с соответствующим вопросом SO.
Error: User Rate Limit Exceeded Luv
11

Не существует переносимого способа получить размер памяти, выделенной функцией malloc ().

Тем не менее, всегда можно сделать что-то подобное, чтобы смоделировать то, что вы хотите.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void myfree(void * p) {
    size_t * in = p;
    if (in) {
        --in; free(in);
    }
}

void * mymalloc(size_t n) {
    size_t * result = malloc(n + sizeof(size_t));
    if (result) { *result = n; ++result; memset(result,0,n); }
    return result;
}

size_t getsize(void * p) {
    size_t * in = p;
    if (in) { --in; return *in; }
    return -1;
}

#define malloc(_x) mymalloc((_x))
#define free(_x) myfree((_x))

void *reallocation(void *ptr,size_t size) {
    void *newptr;
    int msize;
    msize = getsize(ptr);
    printf("msize=%d\n", msize);
    if (size <= msize)
        return ptr;
    newptr = malloc(size);
    memcpy(newptr, ptr, msize);
    free(ptr);
    return newptr;
}
int main() {
    char * aa = malloc(50);
    char * bb ;
    printf("aa size is %d\n",getsize(aa));
    strcpy(aa,"my cookie");
    bb = reallocation(aa,100);
    printf("bb size is %d\n",getsize(bb));
    printf("<%s>\n",bb);
    free(bb);
}
Error: User Rate Limit Exceeded
3

malloc не инициализирует память на ноль. (calloc это эквивалентно.) Если вы видите, что все установлено на ноль, это случайно.

Я считаю, что версия библиотекиrealloc использует информацию о длине в куче, которая не доступна напрямую. (И это может переоценить исходное распределение, что означает, что он может скопировать немного дополнительной памяти при использованииrealloc расширить распределение. Это вообще не имеет никакого эффекта.)

realloc скорее всего, не делает копию при сокращении выделения.

Кроме того, я должен отметить, что в тех же случаях вам не нужно делать копию, даже когдаrealloc увеличивает размер, например, если следующий блок в куче свободен.

Попробуйте этот забавный код в g ++:int *ip=new int;*ip=42;delete ip;int *ip2 = new int; std::out << *ip2 << endl;Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededaccidentallyError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы