MW211 EXIT

devlog
C言語/文字列の自家生成
2012年10月14日
自前で文字列を生成してそのポインタを返却する関数があった場合、
返却する文字列の実体は「static変数」にしておかなければならない。
なぜなら、関数が終了した時点で、実体がなくなってしまうからである。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    static const char  str[4];                                              │
│    sprintf(str, "%s", "abc");                                              │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
但し、ポインタアドレスを中継するだけならば、「static変数」でなくてもよい。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    const char*  str;                                                       │
│    getSub(str);  // 文字列のアドレスが返却される                           │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
なので、こんな感じで初期化したりできる。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    const char*  str = "";  // 初期化                                       │
│    getSub(str);  // 文字列のアドレスが返却される                           │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
極端な話、以下のようなものもOKだ。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    const char*  str = "xyz";                                               │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
文字列リテラル(上記の例では"abc")は、無条件でstaticでconstなものになるらしい。
┌──────────────────────────────────────┐
│const char*  getStr(void) {                                                 │
│    static const char*  str = "abc";                                        │
│    return str;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++