2

私は C に少し慣れていないので、memcpy の実装を検討していました。ポインター pDst を署名されていない文字にキャストする必要があるのはなぜですか? pSrcも同じ?

void memcpy( void *pDst, void *pSrc, int len )
{
    int i;

    if( pDst == NULL || pSrc == NULL )
        return;

    for( i=0; i<len; i++ ) {
        ((unsigned char*)pDst)[i] = ((unsigned char*)pSrc)[i];
    }
}
4

3 に答える 3

8

へのポインターvoidは、「何かへのポインター」と言うための便利な省略形ですが、逆に、コンパイラーは、指されているものがどれだけ大きいかを知りません。

そのため、何らかの演算を行う場合 (配列としてインデックスを付けるなど) は、明示的なサイズを使用する必要があります。この場合、バイトごとのコピーを実行しようとしているため、unsigned char一般的に「1 バイト」と言う方法であるキャストを使用します。

(これは一見、常に真であるように見えるかもしれません。しかし、場合以外memcpyでは、ある種の構造など、より大きなものを指している可能性があり、インデックス/算術演算は実際にはその構造のサイズの増分を参照しているため、ある構造から次の構造にスキップします。)

于 2013-02-18T02:22:30.167 に答える
4

を逆参照できないためですvoid*。コピーするバイト数をコンパイラに明示的に伝える必要があります。の場合unsigned char、それは 1 になります。

于 2013-02-18T02:22:05.007 に答える
0

char *またはにキャストしてunsigned char *、追加する必要があるバイト数をコンパイラに伝える必要があります。char *またはunsigned char *場合は1バイトを追加します。次の要素 = 実際には要素 + (i * 型の長さ) でありvoid *、何もない型であるため、次のようにキャストする必要があります。char *

于 2013-02-18T02:32:28.860 に答える