2017-03-14 11 views
0

I次のコードを持っている:ボイドテーブルにテーブルを格納する方法

void fill_buffer(void *buffer) 
{ 
    char cbuf[20]={1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,11,12,13,14,15}; 
    void* vbuf = (void*) cbuf; 
    buffer=vbuf; 
} 

は、私は、メイン関数から私に与えられているバッファを埋めるためにしようとしていますが、私は記入するかどうかはわかりませんボイドテーブルを適切に。主な機能のバッファで定義されています

unsigned char buffer[20]; 
+3

?ポインタを割り当てるだけでは、指し示すオブジェクトの内容はコピーされません。 – StoryTeller

+1

ポインタが配列ではありません。そして、あなたは 'cbuf'をコピーしないことを知っていますか?あなたは何をしたいですか?なぜあなたは 'void * 'を使うのですか?特別な使用のための最後の再ソートです。本当の必要がなければそれを使わないでください。 – Olaf

+0

あなたは何をしようとしていますか?それはバッファーにコピーする必要があるように見えますが、他の方法ではありません。 –

答えて

1

cbuffill_buffer()にローカルであり、関数が戻るとき、それは

void 
fill_buffer(void *buffer, size_t bufsize) 
{ 
    static const unsigned char cbuf = { 
     1, 2, 3, 4, 5, 6, 7, 8, 
     9, 9, 9, 9, 9, 9, 9, 11, 
     12, 13, 14, 15 
    }; 
    if (bufsize > sizeof(cbuf)/sizeof(*cbuf)) 
     bufsize = sizeof(cbuf)/sizeof(*cbuf);   
    memcpy(buffer, cbuf, bufsize); 
} 

にあなたを試す行うには、割り当て解除されますので、あなたは、データをコピーする必要がありますbufferに十分な記憶域が割り当てられていることを確認する必要があります。この場合はbufsizeバイトですが、cbufの要素のタイプが異なる場合は、sizeof(element_type)を使用する必要があります。

また、おそらくのバイト数を返します。実際にはがコピーされます。

+0

ありがとう、これは非常に役に立ちました! – toubinaattori

+1

型が一致しない場合、コードはUBを呼び出すことができます。ほとんどの場合、 'void *'を使うのは良い考えではありません。 – Olaf

0

fill_bufferは、このようにすべての内容がバッファに終わる保証、自分自身の配列を作成することができます別のアプローチは、このです:

void fill_buffer(void **buffer) { 
    static const unsigned char cbuf[4] = { 
     'a', 'b', 'c', 0, 
    }; 
    *buffer = (void*)cbuf; 
} 

あなたはこのようmainでそれを使用することができます。

void* buffer; 
fill_buffer(&buffer); 
0

DunnoとIharob Al Asimiの回答は正しいですが、ここではあなたのコードがうまくいかない理由を説明します:

あなたの関数ta引数として渡されたものからコピーされたポインタをパラメータとして返します。したがって、関数内でポインターを変更しても、もともと関数に渡されたポインターは変更されません。

void fill_buffer(void *buffer); 
int main() 
{ 
    void* ptr = (void*) NULL; 
    fill_buffer(ptr); 
    printf("%d", ptr); 
    return 0; 
} 

プリント:0

これは知らんが元のポインタの値を変更するために、ポインタへのポインタを使用する理由です。また

、ここで働くあなたのコードの修正版(使用していますが、悪いコーディングの練習がある知らんのかIharobアルAsimiのソリューション):バッファがvoidポインタとして渡されるのはなぜ

void fill_buffer(void *buffer); 
int main() 
{ 
    unsigned char buffer[20]; 
    fill_buffer(buffer); 
    for(unsigned int i = 0; i < 20; i++) 
    { 
     printf("%d\n", buffer[i]); 
    } 
    return 0; 
} 

void fill_buffer(void *buffer) 
{ 
    unsigned char* buff = buffer; 
    unsigned char cbuf[20]={1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,11,12,13,14,15}; 
    for(unsigned int i = 0; i < 20; i++) 
    { 
     buff[i] = cbuf[i]; 
    } 
} 
関連する問題