-2

次のコードのように:

#include <iostream>
#include <string>

#define BUF_LEN_HEAP 32
#define BUF_LEN_STACK 64

int getBufLen(const char *buf)
{
    //...
}

void foo(const char *buf)
{
    int len = getBufLen(buf);
    //memcpy(new_buf, buf, len);
    //...
}

int main()
{
    char buf_stack[BUF_LEN_STACK];
    char *buf_heap = new char[BUF_LEN_HEAP];
    std::string str("abcdef");

    foo(buf_stack);
    foo(buf_heap);
    foo(str.c_str());

    delete [] buf_heap;

    return 0;
}

バッファの長さを取得する場合、引数を関数に渡すのは非常に困難です。

スタックまたはヒープに割り当てられたバッファに関係なく、バッファの長さを取得する低レベルの方法はありますか?

4

1 に答える 1

2

いいえ、配列を宣言したメソッドの外部で配列のサイズを取得する方法はなく、配列が静的な長さ (コンパイル時に既知) で宣言されている場合のみです。

これを処理する通常の方法は、ポインタとサイズの両方をバッファに書き込む関数に渡すことmemcpyです。

std::vectorC++ では、プレーンな配列の代わりに aを使用するより良いオプションが常にあります。はstd::vector、必要なすべての情報を 1 つのオブジェクト内で運ぶので、簡単に受け渡すことができます。

于 2013-11-15T06:54:50.850 に答える