3

起動時に定義する「staticchar*」の値を変更しようとしています。関数内から変更します。この関数がvarを返すと、値を再設定しようとしても値が保持されません。

例:

static char *X = "test_1";

void testFunc()
{
    char buf[256];
    // fill buf with stuff...
    X = buf;
}

bufにstaticを使用せずにこれを実現するにはどうすればよいですか?別のデータ型を使用する必要がありますか?もしそうなら、どれ?

4

3 に答える 3

6

この行は、配列の最初の要素を指すようにX = bufポインターを設定します。関数が戻ると、スコープ外になり、使用できなくなるため、その時点ではポインタは役に立ちません。Xbufbuf

プログラムで生のC文字列を使用する特別な理由がない限り、std::stringコンテナを使用すると、単にaを返すことができstd::string、文字列のメモリを動的に割り当てて管理する必要はありません。

于 2010-05-29T02:48:43.877 に答える
2

Jamesが言ったように、std::string...を使用します。ただし、グローバルな構築と破棄の順序は、翻訳ユニット間で定義されていないことに注意してください。

したがって、それでも使用する場合はchar*、を使用してstrcpy(を参照man strcpy)、bufNULで終了することを確認してください。strcpyはをbuf宛先にコピーしますX

char buf[256];
// ...
strcpy(X, buf);

を使用する理由は他にもあることを付け加えておきますstd::string。を使用する場合は、宛先バッファ( )にソースバッファを受信するのに十分なメモリがstrcpyあることを確認する必要があります。Xこの場合、256はよりもはるかに大きいためstrlen("test_1")、問題が発生します。この再割り当てXを回避する方法があります(このようにX = new char[number_of_characters_needed])。またはX、の代わりに256のchar配列に初期化しchar*ます。

IIRC、strcpy静的に定義された文字列リテラル(char * X = "test_1"など)は未定義の動作です...ストーリーの教訓は... C ++です!使用してくださいstd::string!:)

(あなたはc ++を初めて使用したと言ったので、「未定義動作」はコンピュータがあなたの顔を殴ることができることを意味するのを聞いたことがないかもしれません...それは通常あなたのプログラムがクラッシュすることを意味します)

于 2010-05-29T02:54:08.383 に答える
0
static char *X = "test_1";

void testFunc()
{
    char buf[256];
    // fill buf with stuff...
    X = buf;
}

上記の例でコードを実行してデバッグすると、X = buf; 行で X の値が変更されることがわかります。

buf が static ではなく、特定のスコープ内 ({ } の間) で定義されると、一時的なスタック変数として割り当てられます。命令ポインターがそのスコープを離れるたびに、buf は未定義になりますが、X は古い buf アドレス (スタック アドレスを指す) を無効なデータと共に保持します。

X は単なるポインタなので、いつでも変更できます。そして静的であることを考えると、その定義はプログラムの最後まで有効に保たれます。

したがって、X の値を変更したい場合は、好きなようにアトリビュートしてください。X データ (*X) にアクセスする前に、それが指すデータを無効にしないように注意してください。

于 2010-05-29T04:12:16.843 に答える