1. ホーム
  2. c++

[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"

2022-01-19 02:59:46

質問

私はCプログラマーではないので、C-stringにはあまり詳しくありませんが、現在Cライブラリを使用しなければならないので、私の問題を実証するために私のコードの短縮版をここに示します。

char** ReadLineImpl::my_completion () {
    char* matches[1];
    matches[0] = "add";

    return matches;
}

この警告が表示されるのですが。

警告 - ローカル変数 'matches' に関連付けられたスタックメモリのアドレスが返されました。

そして、私のプログラムは正しく動作しないようです(上記の警告が原因かもしれません)。

この警告は何を意味するのでしょうか、また、何か問題が生じるのでしょうか。

解決方法は?

変数 char* matches[1]; はスタック上で宣言され、現在のブロックがスコープ外に出たときに自動的に解放されます。

つまり matches のために予約されたメモリは matches が解放され、あなたのポインタは、あなたが望まないものを指すようになります。

いろいろな方法でこれを解決することができますが、そのうちのいくつかを紹介します。

  1. 宣言する matches[1] として static : static char* matches[1]; - これ のための領域を確保します。 matches をスタック上ではなく、静的空間に置くことです。 のインスタンスはすべて、この機能を使用することができます。 my_completion 関数 は、同じ matches 変数)を使用します。

  2. 呼び出し側の関数で領域を確保し、それを my_completion 関数を使用します。 my_completion(matches) :

    char* matches[1];
    matches = my_completion(matches);
    
    // ...
    
    char** ReadLineImpl::my_completion (char** matches) {
         matches[0] = "add";
    
         return matches;
    }
    
    
  3. ヒープ上の呼び出された関数に領域を確保する(using malloc , calloc など) を作成し、呼び出し側の関数に所有権を渡します。呼び出し側の関数は、不要になったときにこの領域を解放しなければなりません ( free ).