2017-01-14 7 views
-1

私はこの機能があります。c++ Shellエラー++機能

char* return_string(){ 
    char buffer[] = "Hi world!"; 
    return buffer; 
} 

bool test08() 
{ 
    char compare[] = "Hi world!"; 
    int result = strcmp(compare,return_string()); 
if (result == 0) return true; 
return false; 
} 
int main() 
{ 
if(test08) printf("\nTRUE"); 
else printf("\nFALSE"); 
} 

なぜこのコードの実行を、それがコードブロックV 13.12(セグメンテーションフォールト)ではありません。

char* return_string(){ 
    char buffer[] = "Hi world!"; 
    return buffer; 
} 

コピーした文字列「こんにちは世界:私はchar *buffer=;に私のchar buffer[]=宣言を変更した場合には、この私が(知っやすい)C++での初心者ですので、明確にしてください...

+1

これは未定義です。あなたはローカル変数へのポインタを返しています。 –

+0

関連のない言語のタグをスパムしないでください。 – Olaf

答えて

1

ちょうど次のよう

const char* return_string(){ 
    const char *buffer = "Hi world!"; 
    return buffer; 
} 

元の関数の実装に問題機能return_stringを変更アレイbufferが出た後生存できなくなり、自動保存期間を持つ関数の局所的な配列であるということです関数。

修正された関数には、静的な記憶期間を持つ文字列リテラルが使用されます。だから、文字列リテラルの最初の文字へのポインタを返すかもしれません。

機能test08return_stringの範囲で定義されているローカル変数bufferに単純

bool test08() 
{ 
    char compare[] = "Hi world!"; 
    return strcmp(compare, return_string()) == 0; 
} 
1

をうまくいきます! "ローカル変数bufferに格納してから、そのローカル変数を返します。その戻り値を使用しようとすると、関数の終了時にバッファが破棄されるため、未定義の動作になります。

この:おそらくあなたが望んでいないものをにもかかわらず

char* return_string(){ 
     char *buffer = "Hi world!"; 
     return buffer; 
    } 

は、実際に、OKでしょう。あなたは文字列リテラル(不思議な場所に格納された、標準)の先頭のアドレスを返します。これはOKです.C++では、constに問題があります。

1

あなたの機能return_stringが返すポインタを書き込むことができます。関数が復帰すると、bufferが格納されていた場所のアドレスを返し、そのアドレスに格納されている値はもはや有効ではなくなります。 さて、あなたは文字へのポインタを返すに主張すれば、あなたが動的に「Hello World」を割り当てることができ、は後でそれを解放するために覚えている:「こんにちは世界」が格納されているメモリではないので

char * return_string() { 
    char local_var[] = "hello world"; 
    char *buffer = (char *) malloc(sizeof(local_var)); 
    strcpy(buffer, local_var); // we know that buffer is big enough to hold local_var 
    return buffer; 
} 

を関数のローカルでは、関数が終了すると解放されません。

もう一つの(より良い)解決方法は、(あなたの価値を保持するのに十分な大きさ)をreturn_stringに静的に割り当ててそこの内容を変更することです。

void return_string(char *buffer, size_t buffer_size) { 
    strncpy(buffer, "hello world", buffer_size); 
} 
0

バッファへのポインタを返していますが、関数が戻るとバッファ変数が破棄されます。

バッファーを静的にする必要があります。

0

これはまったく回答ですが、まだ...
私はCodeBlocks 16.01(mingw)を試しましたが、すべてがスムーズに機能します。 早急に提案してください。アップグレードされたバージョンのソフトウェアを使用してみてください。

+0

これはコードが間違っていても、意図しない*動作している "未定義の動作"の典型的なケースです。バグを識別するのがずっと難しくなります。 – merlinND

+0

C++はこのように動作しません。うまくいくと思われるだけで、コードが「OK」であるとは限りません。ローカル変数のアドレスを返すことは、その動作が何であるかにかかわらず、未定義の動作です。それはうまくいくかもしれませんが、失敗する可能性があります。異なるオプションでコンパイルすると失敗する可能性があります。今日はうまくいくかもしれないし、明日失敗するかもしれません。 – PaulMcKenzie