2011-07-09 13 views
2

構造体のメモリブロック内の構造体へのポインタを増やすことはできません。しかし、それは動作するようです。これがうまくいかない場合はありますか?構造体の "リスト"を作成すると、ポインタを増やすことができるはずです。Cは移動するバイト数を把握します。C構造体ポインタの反復

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

struct User { 
    int id; 
    char name[32]; 
    float net_worth; 
}; 
typedef struct User User; 


int main(int argc, char** argv) { 
    User* u1 = (User*)malloc(sizeof(User)); 
    u1->id = 1; 
    strcpy(u1->name, "Mike"); 
    u1->net_worth = 43.45; 
    User* u2 = (User*)malloc(sizeof(User)); 
    u2->id = 2; 
    strcpy(u2->name, "Pablo"); 
    u2->net_worth = -2.00; 
    User* u3 = (User*)malloc(sizeof(User)); 
    u3->id = 3; 
    strcpy(u3->name, "Frederick"); 
    u3->net_worth = 7329213.45; 

    User** users = (User**)malloc(sizeof(User)*10); 
    *users = u1; 
    printf("%s\n", ((User*)(*users))->name); 
    *users++; 
    *users = u2; 
    printf("%s\n", ((User*)(*users))->name); 
    *users++; 
    *users = u3; 
    printf("%s\n", ((User*)(*users))->name); 


    return 0; 

} 
+0

質問は正確には何ですか、正しく動作することがわかりますか? –

+0

さて、私は何かが欠落していないことを確認したいと思います。 –

+2

'* users ++'という式を使用している特別な理由は何ですか? '*'は余計です( '++ 'の結果を単に逆参照します)。また、 'users'自身ではなく、' * users'をインクリメントしようとしているように思われるかもしれません。 –

答えて

5

これは設計によるものです。あなたはあなたがuserArray[1]、または*(userArray + 1)を経由して第二のユーザにアクセスし、または最初の要素へのポインタを取得し、++を経由して、それをインクリメントする可能性がどちらか

User userArray[16]; 

を持っていると仮定します。

3

非常に単純です:はい。これは、ポインターが型を持っている理由です。

+0

私はそれが15文字を必要とするので、yesのコメントを投稿できませんでした – Ulterior

0

はい。

(30文字の要件を投稿埋めるためにテキスト)

1

はい、これは、動作するように意図しています方法です。配列内のポインタに1を加えると、実際に次の要素に進みます(Cは構造体のサイズ、正しい量だけメモリアドレスを調整します)。

これがうまくいかないのは、あまりにも遠くに行くときだけです。ポインタは、配列内を指している場合(逆参照およびポインタ算術用)またはそれを超えるポインタ(算術のみの場合)のみ有効です。したがって:

int x[10]; 
int *px = &(x[9]); // Points to last element, okay to dereference. 
px++;    // Points one beyond, still okay for aritmetic. 
px++;    // Don't use this for anything. 

は、後でポインタを使用しようとすると、定義されていない動作と見なされます。

+0

ちょっとFIY:終わりを越えてポインタを指している(そしてそのポインタをポインタ算術に使う)のがいいですが、逆参照するのは大丈夫です。 – pmg

+0

2番目のFIY:おそらく、&(x [9])の代わりにx + 9を書くでしょう(xはint *型も持っています)。 – jforberg

+0

@jforberg、私たちのような味付けされたコードサルは違いがないことを認識しているかもしれませんが、初心者が "配列に9を加える"より "要素番号9のアドレス" – paxdiablo

0

とCは移動するバイト数を把握していますか?

はい。それはCがあなたが構造体に入れることができるものに制限を課している理由です:与えられた型の構造体のすべてのインスタンスは同じサイズでなければならず、コンパイラはコンパイル時にそのサイズを知ることができなければなりませんこのスキームが機能するためには、

関連する問題