次のプログラムで文字列リテラル"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
を使用する必要がありますか?
'const'は読み取り専用ではありません。 Cには 'enum'定数以外の記号定数はありません。 – Olaf
自動変数で定数をコピーすると、変数を使用すると寿命が短くなります!ポインタに割り当てられます。 –