[解決済み】C言語で関数から `struct` を返します。
質問
今日、私は友人たちにC言語の使い方を教えていました。
struct
s. そのうちの一人が
struct
へのポインターを返すことになる。
malloc
編
struct
sの代わりに."。
C++をメインにやっている人間からすると、このようなものは返せないと思っていました。
struct
を値で指定します。C++では
operator =
オブジェクトを値で返す関数を持つことは、非常に理にかなっています。しかし、C言語ではそのようなオプションがないため、私はコンパイラが実際に何をしているのかを考えるようになりました。次のようなことを考えてみよう。
struct MyObj{
double x, y;
};
struct MyObj foo(){
struct MyObj a;
a.x = 10;
a.y = 10;
return a;
}
int main () {
struct MyObj a;
a = foo(); // This DOES work
struct b = a; // This does not work
return 0;
}
その理由は
struct b = a;
は動作しないはずです -- オーバーロードはできません。
operator =
をデータ型として使用することができます。どうして
a = foo();
はうまくコンパイルできるでしょうか?それは
struct b = a;
? という問いかけが必要かもしれません。は一体何なのか?
return
ステートメントと連動して
=
のサインは?
どのように解決するのですか?
関数から構造体を返すことができます(あるいは
=
演算子)は問題なく使用できます。 これは言語の中できちんと定義された部分なのです。 唯一の問題は
struct b = a
は、完全な型を提供しなかったことです。
struct MyObj b = a
は正常に動作します。 構造体を渡すことができます。
から
構造体は、パラメータ渡し、戻り値、代入の点で、他の組み込み型と全く同じです。
構造体をパラメータとして渡す、関数から構造体を返す、代入文の中で構造体を使う、この3つを行う簡単なデモプログラムを紹介します。
#include <stdio.h>
struct a {
int i;
};
struct a f(struct a x)
{
struct a r = x;
return r;
}
int main(void)
{
struct a x = { 12 };
struct a y = f(x);
printf("%d\n", y.i);
return 0;
}
次の例は、ほとんど同じですが、組み込みの
int
型はデモのために使用します。 この2つのプログラムは、パラメータ渡しや代入などの値渡しに関して、同じ挙動をします。
#include <stdio.h>
int f(int x)
{
int r = x;
return r;
}
int main(void)
{
int x = 12;
int y = f(x);
printf("%d\n", y);
return 0;
}
関連
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】strcmpが機能しない
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?