関数の戻り値を割り当てることができるのはなぜですか?

c function lvalue return-value
関数の戻り値を割り当てることができるのはなぜですか?

次の関数を考えてください。

 char *f()
 {
 char *s=malloc(8);
 }
 main()
 {
  printf("%c",*f()='A');
 }

行 `char * s = malloc(8);`にコメントすると、割り当て `* f()= ‘A’`が無効なメモリにアクセスしたかのようにエラーになります。 私は変数を返さないので、なぜ上記の割り当てはまったく機能しますか?

2番目の質問: ’A’`は、functionの戻り時に作成された一時変数に割り当てられます。 だからなぜ「++ a」などができないのか 左辺値として使用されますか?

  1  0


ベストアンサー

戻り値がレジスターに渡されると仮定すると、mallocからの戻り値は、f()から戻るときにまだ存在する可能性があります。 純粋な偶然によって。

`* f()`に割り当てるときは、一時的なものではなく、mallocから返されたメモリに割り当てます。 ++ aへの割り当てはまったく異なります。

4


あなたの関数 `f()`は何も返さないので、追加する必要があります:

return s;

しかし、正直なところ、これはあなたの問題の始まりにすぎません。 また、 `f()`の戻り値を `free()`する必要があります。

この質問にC ++をタグ付けした理由はわかりませんが、これは明らかにCであるため、タグ付けしていません。

0


return`文で f() `にポインタを返さなければなりません。そうしないと不正なポインタが返されます:

char *f()
{
    char *s=malloc(8);
    return s;
}

0


関数は何も返しません。 関数をreturn-type `char *`で宣言するため、現在のC ++標準の6.6.3.2項で定義されているように、何も返さないと未定義の動作になります。

_
関数の終わりから流れ出すことは、値を持たない「戻り値」と同等です。これにより、値を返す関数で未定義の動作が発生します。
_

未定義の動作とは、https://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407 [何でも起こりうる]を意味します。 この問題を修正するには、関数は次のようになります。

char *f()
{
    return malloc(8);
}

0


関数では、ものを割り当てることができるポインタを返します…​ ++ a`は、 const`参照またはインスタンスを返すことでそれを防ぎます。 const char * f(){…​ }.

もちろん、 `++ a`を異なる方法で実装することもできます:)

0


1 / f()の戻り値は初期化されていないポインターですが、存在します。 + * f()は、指定されていない(ランダムな)アドレスが指す値を返します。 +このアドレスへの書き込みは無効なメモリアクセスです。または、このアドレスが書き込み可能なメモリ(スタックまたは以前に割り当てられたヒープ)である場合はそうではありません。 + Cでは、メモリに適切にアクセスすることを保証するのはユーザーの責任です。

2 /「A」はここでは一時的に割り当てられていません。

0


タイトルとURLをコピーしました