2
4

4 に答える 4

1

次のようにすると、foo() の結果をどこでも使用できます。ただし、これを変更したり解放したりしないでください。このコードが DLL またはライブラリの一部であるかどうかは関係ありません。

const char * foo() {
    return "hello";
}

// This is identical.
const char * foo() {
    const char *x = "hello";
    return x;
}

変更できるようにしたい場合は、次のようにすることができます。は staticであるため、すべての呼び出しfoo()は同じメモリを参照することに注意してください。xここでは、 を変更できますがx、解放しないでください。

char * foo() {
    static char x[] = "hello";
    return x;
}

の結果を解放できるようにしたい場合はfoo()、 でスペースを割り当てる必要がありますmalloc()

于 2012-12-25T03:18:26.613 に答える
1

コードの観点からのみであれば、これは安全です。ただし、test() では、文字列 const のみを str に割り当てることができることを確認する必要があります。次のような場合:

const char *test() {
  char somestr[somesize];
  str = somestr;
  return str;
}

それはまだ安全ではありません。

于 2012-12-25T03:11:36.247 に答える
0

ポインターに文字列リテラルを割り当てれば安全ですが、そうする場合は、関数を全体から除外するのが最善のようです。

static char str[] = "hello world";

次に、配列がポインターに減衰するだけなので、strlike aを使用できます。static char *

于 2012-12-25T03:18:47.937 に答える
0

への割り当てstrも必要ありません。それがなくても、関数から文字列リテラルのアドレスを返し、その後その文字列をどこでも安全に使用できます。

于 2012-12-25T03:12:58.440 に答える