1

使用する定義済みの構造体があります:

typedef struct somestruct_s {
    int s;
    union {
        unsigned char *ptr;
        unsigned char l_ptr[sizeof(char *)];
    };
}somestruct_t, *somestruct;

メモリ使用量を減らすためのユニオンが含まれています。サイズはm32とm64のコンパイル(ポインターサイズ)によって異なる可能性があることを知っています。私の質問は、その構造体を正確な割り当てに「使用」する方法です。この構造体の目的は、基本的なビット演算を実装することです。s変数には、バイト単位のビットマップのサイズが含まれます。ビットマップがビットマップへのポインタによって占有されているメモリ内に収まる場合は、そこに彼女を割り当てます。いくつかのビットマップ操作を記述していますが、構造体や操作方法を実際に取得できません。

4

1 に答える 1

0

私はあなたの問題が何であるか理解できません。ポインタのサイズに応じてビットマップに正しいポインタを返す1つの主要な関数が必要です。

unsigned char* somestruct_get_bitmap(somestruct_t* ths) {
    if( sizeof(char*) > ths->s ) 
        return ths->ptr;
    return ths->l_ptr;
}

他のすべての関数は、ビットマップへの正しいポインタを取得するためにこの関数を使用する必要があります。また、コンストラクタ/デストラクタのペアを使用して、ビットマップポインタを正しい方法で初期化/非初期化する必要があります(これは、nullで終了するビットマップがあると仮定した場合の最も簡単な例です)。

unsigned char* somestruct_init(somestruct_t* ths, unsigned char* ptr) {
    ths->s = strlen(ptr) + 1;
    if( sizeof(char*) > ths->s )  {
       ths->ptr = strdup(ptr);
       return;
    }
    strcpy(ths->l_ptr, ptr);
}

unsigned char* somestruct_destroy(somestruct_t* ths) {
    if( sizeof(char*) > ths->s )  {
        free(ths->ptr);
        return;
    }
}
于 2013-03-25T13:48:23.037 に答える