0

ここにこのコードがありますが、コンパイルエラーが発生しています。ここには、基本的にまったく同じタイトルの質問が他にもたくさんあることを理解しています。私はそれらのかなりの数を読みましたが、すべての質問に答えているわけではありません. 過去数日間、スタックオーバーフローや教育サイトでポインターと構造について多くのことを読んできましたが、ここでも数十のサイトがあり、解剖して説明するには、目の前に物理的な例が必要だと感じています。私はこのことのほとんどを知っているように感じますが、自分がなりたいと思っている以上に、自分自身についてかなり確信が持てません. 誰かが何が起こっているのかを理解するのを手伝ってくれたら. 私は何が起こっていると思うかを伝える番号付きのリストを下に投稿しました。私がほとんどの場合正しいことを願っています。さて、ここにコードがあります。

struct foo{
    int num;
    char  *word;
    struct foo *ptr;
};

void func1(struct foo*);
void func2(struct foo);

int main() {

    struct foo a;
    a.num = 20;
    a.word = "wordOne";
    func1(&a);
    printf("%d %s", a.num, a.word);       // refer to #3 below.

    a.ptr = &a;
    a.num = 55;
    a.word = "thirdToLastWord";
    func2(a);
    printf("%d %s\n", a.num, a.word);
}

void func1(struct foo *a)
{
    while(*(a->word) != '\0')
        {
            putchar(*(a->word));
            a->word++;
        }
    putchar('\n');
    if(a->num % 10 != 0)
        { a->num *= 2; }
    a->word--;
    printf("num equals %d\n", (*a).num);
}

void func2(struct foo a)
{
    if((*a).num == a->ptr->num)               //compiler error
        {(*a).num = (*((*a).ptr)).num +1; }   //compiler error
    else    {   a->num = 200;   }
    a->word = "wordsix";
    a->ptr->word = "wordseven";
    printf("function 2 %d %s\n", (*a).num, (*((*a).ptr)).word);}
}

Ok。それで、最初の機能を理解したと思います。しかし、私が間違っている場合、またはそれが何をしているのかについての理解が間違っているように思われる場合は、以下のいずれかで私を修正してください.

1) main func1 が構造体 "foo" をポインターとして宣言する前。func1 が呼び出されると、「a」のアドレスを渡すので、どのアドレスを指すかがわかります。

2) func1 内のすべてが元の構造体を変更します。func1 の外に出力されると、単語は減分され、最後の文字 "e" のみが表示されます。

3) #3 にコメントした行で、元の構造体 foo の .num を出力しており、ポインターのバージョンではありません (それらは同じものですが)。

これまでのところ、めちゃくちゃになっていないことを願っています。

4) わかりましたので、a.ptr = &a は、元の foo 構造体の struct var "struct foo *ptr" を a のアドレスに等しく設定します。これはたまたま、ポインタ「struct foo *ptr」が自分自身を見つけた正確な構造体です。

5) そして、私たちは彼を (main/orig 構造体) のメンバーと呼んでいます。彼はすでに main の上のポインタとして確立されています。

6) では、これは構造内のポインターによって相互にリンクされている構造内の構造の無限ループを作成しますか?

私がコンパイラエラーにコメントした場所は、私が問題を抱えていると確信しているところです。

7) まず、a.ptr = &a; を設定した後。初期化されたポインター「ptr」を使用して、構造体のコピーを関数 func2 に渡します。はい?

8) 最初の if stmt では、a->word を a->ptr->num と比較しているように見えます。私が言うことの意味は次のとおりです。再びポインタ "a" によって指されている } それは正しいようですが、そうではないと思います....

9) それが本当なら、下の行は +1 が追加されたまったく同じことを言っています.

10) そして最後に、main 内の最後の printf が、func2 に入る前の num と word が何であるか、または func2 内のいくつかのポインターが値を変更したかのいずれかを出力すると思います。

このポインター && 構造 ptr->member および/または structure.member のものを頭に刻み込むために何をすべきかについて、すべてのフィードバックと提案をいただければ幸いです。

また、これが私の問題で発生したかどうかはわかりませんが、ダブルポインターでもかなり不安定です。それほど面倒ではない場合、誰かがダブルポインターが私のコードにどのように統合されたのかを教えてもらえますか?

ありがとうございました

4

2 に答える 2

0

a はポインターではありません。多くの場合、演算子を使用し->て非ポインターstructメンバーにアクセスしているため、エラーが発生しています。

あなたのコードには多くのエラーがあります。たとえば、 にメモリを割り当てていません*word。しかし、それに値を保存します:

a.word = "wordOne";

numとして構造体メンバーにアクセスする必要がありますa.num

これは、構造へのポインターの使用に関するチュートリアルであり、理解に役立つ場合があります。

于 2012-04-21T23:59:51.613 に答える