3
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() によって割り当てられたメモリのサイズを取得するにはどうすればよいですか。

また、以前に割り当てられたメモリのサイズが新しく必要なサイズよりも大きい場合、インプレース再割り当てを行うことはできますか?

4

3 に答える 3

13

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);
}
于 2012-06-02T18:46:08.453 に答える
3

mallocメモリをゼロに初期化しません。(callocは と同等です。) ゼロに設定されているものを見ている場合、それは偶然です。

のライブラリ バージョンは、realloc直接利用できないヒープ内の長さ情報を使用していると思います。realloc(そして、元の割り当てを過大評価する可能性があります。つまり、割り当てを拡張するために を使用するときに、少し余分なメモリをコピーする可能性があります。これは通常、効果がありません。)

realloc割り当てを縮小するときにコピーを実行しない可能性があります。

reallocまた、ヒープ内の次のブロックが空いている場合など、サイズが大きくなってもコピーする必要はありません。

于 2012-06-02T17:55:20.507 に答える
1

malloc によって割り当てられたメモリはゼロに初期化されるため、その状態をチェックしています。

それは正しくありません。ドラフトから:

説明

2 malloc 関数は、サイズが size で指定され、値が不定であるオブジェクトにスペースを割り当てます。

あなたのgetsizeニーズを修正する必要があります。

私の再割り当て機能は正常に機能しています。

配置を修正することさえしていません-特定のタイプでは失敗する可能性があります。このSOの質問を読んでください。

また、以前に割り当てられたメモリのサイズが新しく必要なサイズよりも大きい場合、インプレース再割り当てを行うことはできますか?

インプレース再割り当てとはどういう意味ですか? これは単純なノーオペレーションであるべきではありませんか?

于 2012-06-02T17:55:49.473 に答える