構造体ポインタ-ポインタを使用して構造体の配列にアクセスする

モハマド・アリーブ・シディキ

私はこの簡単なプログラムを持っています:

#include <stdio.h>

struct time
{
    int hours ;
    int minutes ;
    int seconds ;
} t[2] = {1,2,3,4,5,6};

int main() {    
    struct time *tt = t;
    printf("%d\n", (*tt));
    printf("%d", *(tt+1));
}

これで、期待される出力は次のようになります。

1
4

しかし、私が得ている出力は、2つのまったく同じメモリアドレスです。私はこのプログラムを他の人に送りました、そして、いくつかは期待された出力を持っていますが、いくつかはそうではありません。これはCまたはGCCのバージョンの問題だと思います。それは解決可能ですか?私のバージョンのCでこれが発生している理由について何か説明はありますか?

最も奇妙なことは、ポインターを逆参照した後でも、アドレスを出力していることです。これはどのように可能ですか?

一方、プログラムをこれに変更すると、次のようになります。

$include <stdio.h>

struct time
{
    int hours ;
    int minutes ;
    int seconds ;
} t[2] = {1,2,3,4,5,6};

int main() {    
    struct time *tt = t;
    printf("%d\n", (*tt).hours);
    printf("%d", (*(tt+1)).hours);
}

期待される出力を出力します。

この振る舞いの説明は何ですか?ありがとう。

アンティ・ハーパラ

問題はコンパイラではなく、Cの理解にあります。GCCバージョン7.3.0(Ubuntu 7.3.0-27ubuntu1〜18.04)でコンパイルしましょう。

% gcc struct_time.c      
struct_time.c: In function ‘main’:
struct_time.c:12:14: warning: format ‘%d’ expects argument of type ‘int’, 
          but argument 2 has type ‘struct time’ [-Wformat=]
     printf("%d\n", (*tt));
             ~^     ~~~~~
struct_time.c:13:14: warning: format ‘%d’ expects argument of type ‘int’,
          but argument 2 has type ‘struct time’ [-Wformat=]
     printf("%d", *(tt+1));
             ~^   ~~~~~~~

あなたのフォーマットは、対応する引数として%dを期待intするものであり、あなたはを渡していstruct timeます。変換指定子が実際の引数のタイプと一致しないため、プログラムの動作は未定義です。

値がメモリ内のどこにあるかは関係ありません値のタイプも重要です。のアドレスはtt[0]と同じですが、tt[0].hoursタイプが異なります。1つは構造体全体が必要で、もう1つは最初のメンバーに含まれる値が必要です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

「ポインタを使用して構造体の配列にアクセスする」別の方法

構造体のポインタを使用して配列にアクセスする

ポインタを使用して多くの構造体をポイントし、構造体データメンバーにアクセスする

ポインタを介して構造体にアクセスする

ポインタを介して構造体配列にアクセスする方法は?

ポインタを介して構造体のポインタにアクセスする

Cで、構造体のアドレスとポインタを使用して、構造体の最初の要素にアクセスする

構造体内に構造体へのポインタの配列を作成する

ポインタを使用して構造体のメンバーにアクセスする

構造体ポインタを別の構造体にキャストする

ポインタを使用して構造体c ++のベクトル内の要素にアクセスする

構造体ポインタによる構造体の定義

別の構造体を指す構造体のポインタ

構造体ポインターを介して C# から C に構造体の配列を渡す

構造体による配列へのアクセス(ポインターを使用)

C:構造体ポインタ配列

ポインタを使用して構造体に入力する

構造体のポインタの配列を使用したbsearch

構造体のポインタの配列を使用したbsearch

構造体のvoidポインタを構造体にキャストしてメンバーにアクセスする

C構造体、構造体への共用体ポインタ

構造体へのポインタの配列を作成する

その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

C:ポインタ配列に構造体を追加する方法

構造体と構造体へのポインタの使用

自己への構造体ポインタを含む共用体を含む構造体は「。」を使用します。'->'の代わりにアクセス、混乱

ポインタを使用して構造体メンバーにアクセスする方法

ポインタを介して別の構造体のメンバーにアクセスする

構造体のポインタから配列を取得する

TOP 一覧

  1. 1

    PictureBoxで画像のブレンドを無効にする

  2. 2

    HTTPヘッダー 'SOAPAction'の値はサーバーによって認識されませんでした

  3. 3

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  4. 4

    レスポンシブウェブサイトの一番下にスティッキーなナビゲーションバーを作成するのに問題がある

  5. 5

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  6. 6

    Ansibleで複数行のシェルスクリプトを実行する方法

  7. 7

    Python / SciPyのピーク検出アルゴリズム

  8. 8

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  9. 9

    ZScalerと証明書の問題により、Dockerを使用できません

  10. 10

    Rパッケージ「AppliedPredictiveModeling」のインストール中にエラーが発生しました

  11. 11

    テキストフィールドの値に基づいて UIslider を移動します

  12. 12

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  13. 13

    「埋め込みブラウザのOAuthログイン」を有効にしてコールバックURLを指定した後でも、Facebookのコールバックエラーが発生する

  14. 14

    tf.nn_conv2dとtf.nn.depthwise_conv2dの違い

  15. 15

    CSSはアニメーションで変換および回転します

  16. 16

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  17. 17

    Chromeウェブアプリのウェブビューの高さの問題

  18. 18

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  19. 19

    amCharts 4で積み上げ棒グラフの輪郭を描く方法は?

  20. 20

    Officeアドインを使用してOutlookの連絡先のリストにプログラムでアクセスすることは可能ですか?

  21. 21

    Reactでclsxを使用する方法

ホットタグ

アーカイブ