2017-04-19 10 views
0

次のプログラムで文字列リテラル"zero""non-zero"の有効期間はどのくらいですか?私は読み取り専用"zero""non-zero"がある(あるいは少なくともあることが許可されている)ことをthis question in the C FAQ listから知っているCの文字列リテラルの寿命はどのくらいですか?

#include <stdlib.h> 
#include <stdio.h> 

const char* tester(int inp) 
{ 
    const char *retval=NULL; 

    if (inp==0) 
     retval="zero"; 
    else 
     retval="non-zero"; 

    return retval; 
} 

int main() 
{ 
    const char *outval=NULL; 

    outval=tester(0); 
    printf("0 is %s\n",outval); 
    outval=tester(1); 
    printf("1 is %s\n",outval); 

    return EXIT_SUCCESS; 
} 

。私は、 "... discards 'const' qualifier ..."に関するコンパイラの警告を止めるために、char*宣言の前にconstを入れなければならないと考えています。

char* tester(int inp) 
{ 
    char retval[9]; 

    if (inp==0) 
     strcpy(retval,"zero"); 
    else 
     strcpy(retval,"non-zero"); 

    return retval; 
} 
:プログラムは

0の期待される結果がゼロ

1で与えながら、しかし、私はまたtesterのように定義することができないことを知っている非ゼロ

です配列は、testerが終了したときに処分されなければならないため、

です。

元のコードで行ったことを行うことができますか?mallocを使用する必要がありますか?

+0

'const'は読み取り専用ではありません。 Cには 'enum'定数以外の記号定数はありません。 – Olaf

+0

自動変数で定数をコピーすると、変数を使用すると寿命が短くなります!ポインタに割り当てられます。 –

答えて

1

文字列リテラルは、静的な記憶期間を持ちます(つまり、プログラムの実行時間です)。

C標準の§6.4.5/6を参照してください。

+2

[こちらはどこですか?](http://port70.net/~nsz/c/c11/n1570.html#6.4.5p5) –

+0

@eugene:誤植を修正しました(パラ6にあります)。 htmlをありがとう。 – rici

関連する問題