1

次の関数について考えてみます。

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

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

2番目の質問:'A'関数の戻り時に作成される一時変数に割り当てられます。では、なぜ++aなどを左辺値として使用できないのでしょうか。

4

6 に答える 6

4

戻り値がレジスターで渡されると仮定すると、f() から戻るときに malloc からの戻り値がまだそこにある可能性があります。まったくの偶然。

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

于 2011-08-02T09:41:32.210 に答える
0

あなたの関数f()は何も返していません。追加する必要があります:

return s;

しかし、正直なところ、これは問題の始まりにすぎません。free()の戻り値も必要ですf()

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

于 2011-08-02T09:37:20.890 に答える
0

f()ステートメントでポインターを返す必要があります。returnそうしないと、不正なポインターが返されます。

char *f()
{   
    char *s=malloc(8);
    return s;
}
于 2011-08-02T09:38:34.133 に答える
0

あなたの関数は何も返しません。return-typechar *で関数を宣言するため、現在の C++ 標準のパラグラフ 6.6.3.2 で定義されているように、何も返さないと未定義の動作が発生します。

関数の最後から流れることは、return値のない a と同じです。これにより、値を返す関数で未定義の動作が発生します。

未定義の動作とは、何でも起こり得ることを意味します。この問題を解決するには、関数は次のようになります。

char *f()
{   
    return malloc(8);
}
于 2011-08-02T09:45:49.403 に答える
0

関数では、何かを割り当てることができるポインターを返します...参照またはインスタンス++aを返すことでそれを防ぎます。constがあれば、同じ動作をすることができますconst char* f() { ... }

もちろん、++a別の方法で実装することもできます:)

于 2011-08-02T09:50:09.477 に答える
0

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

2/ 'A' はここではテンポラリーに割り当てられていません。

于 2011-08-02T09:50:53.160 に答える