1

次のようなC関数があります。

static uint32_t initrd_read(fs_node_t *node, 
    uint32_t offset, uint32_t size, uint8_t *buffer) {

    initrd_file_header_t header = file_headers[node->inode];
    if (offset > header.length)
        return 0;
    if (offset+size > header.length)
        size = header.length-offset;
    memcopy(buffer, header.offset+offset, size);
    return size;
}

プログラムの残りの部分とリンクすると、 anundefined reference to 'memcpy'がスローされます。memcpyはコードで使用されておらず、定義されていません。コードは独立してリンクされているため、C ライブラリと競合しません。何らかの理由で、リンカーは上記の関数がmemcpy関数呼び出しの最初に呼び出されていると考えていますが、その理由はわかりません。

なぜこれが起こっているのでしょうか?

4

1 に答える 1

3

memcpyコンパイラが暗黙的に使用して、「長い」コピー操作(構造体の割り当てなど)を実行できます。たとえば、あなたのコードであなたはやっています

initrd_file_header_t header = file_headers[node->inode];

これは、実際に通話に変換されるものの良い候補のように見えmemcpyます。

initrd_file_header_tオリジナルに直接アクセスする代わりに、そのオブジェクトのコピーを作成する理由はありますか?私はあなたがそのオブジェクトを変更するのを見ないので、あなたはただ行うことができます

const initrd_file_header_t *header = &file_headers[node->inode];

そして、などのようにフィールドにアクセスしますheader->length。これにより、。への暗黙の呼び出しがおそらく排除されmemcpyます。

于 2012-10-10T05:50:15.173 に答える