私は、関数呼び出しで宣言された変数がスタックにプッシュされ、関数がその終わりに達すると、スタックに宣言されたローカル変数がポップされてララの土地に入ることを認識します。関数で宣言された配列を返すと、Cのローカル変数のアドレスが返されますか?
私が納得していないことは、関数内にポインタを宣言すると、コンパイラの苦情のないポインタを返すことができますが、配列では警告が出ます。それはgetStringArrayの()についての警告「ローカル変数の戻りアドレスを」スローコンパイル中
char * getStringArray();
char * getStringPointer();
int main(){
char * temp1 = getStringPointer();
char * temp2 = getStringArray();
return 0;
}
char * getStringPointer(){
char * retString = "Fred";
return retString;
}
char * getStringArray(){
char retString[5] = {'F', 'r','e','d','\0'};
return retString;
}
:ここ
は、私が参照してるものの一例です。私が混乱しているのは、配列の名前だけで参照すること(retString、no []など)は、ポインタのように動作するメモリ内のアドレスを参照していると言われています。
配列は便利なことがありますし、関数内で配列を使用して返したいということが何度もありますが、これを回避する方法はありますか?
コメントで言及したように、これは機能しますか?私はmallocがヒープに割り当てることを推測していますが、その罰金です。私はまだ静的なデータとヒープ上のデータの違いについては少し不明です。
char * getStringPointer(){
char * retString = (char *)malloc(sizeof(char)*4+1);
*(retString+0) = 'F';
*(retString+1) = 'r';
*(retString+2) = 'e';
*(retString+3) = 'd';
*(retString+4) = '\0';
return retString;
}
ララランドとは何ですか?ポインタはメモリ内のアドレスを指すポインタに過ぎません。 'getStringArray()'に関して、5文字の配列を宣言して定義して戻したが、定義は宣言され、charへのポインタとして定義されているプロトタイプとは一致しない。 – t0mm13b
@ t0mm13b 'char'の配列は' char'へのポインタに崩壊します。したがって、言語弁護士によると、 'getStringArray'については何も*違法です*。しかし、もちろん、スコープ外に出るメモリを指しています。 –
エラーの可能性があることを警告するために、Cコンパイラに依存するべきではありません。それは 'lint'やそれに類するユーティリティが対象としているもので、問題があるものはすべて捕まえていません。 –