0

このプログラムの奇妙な動作を理解できません。file1.c と file2.c の 2 つのファイルがあります。

file.c は

#include <stdio.h>struct ll {
int key;
struct ll *next;
};
extern void func(struct ll*);

int main(void)
{
struct ll l = { 1, &l };
printf("%d %d\n",l.key,l.next->key);
func(&l);
return 0;
}

そして file2.c は次のとおりです。

#include <stdio.h>

 struct ll 
 {
struct ll *next;    
int key;
 };


 void func(struct ll *l)
 {
   printf("%d \n",l->key);
   printf("%d \n",l->next->key);
 }

コンパイルして実行すると、セグメンテーション違反が表示されます。しかし、構造体llを次のように置き換えると、file2.cのようになります。

struct ll 
{
 int key;   
 struct ll *next;       
};

その後、正常に動作します。つまり、宣言の順序を入れ替えるだけで、出力に影響を与えています。

4

1 に答える 1

1

構造体はメモリ内のデータの単なるレイアウトであり、変数を切り替えるため、構造体の宣言は両方の回で同じである必要があります。

あなたの場合、関数のコードはメイン関数で設定されたfunc整数を逆参照しようとします。1(または、int とポインターに互換性がないため、他の奇妙なことを行うこともできます)

file.c:

struct ll: [ int (key)   | pointer (next) ]
struct ll l = { 1, &l }; // this causes:
l:         [ 1           | &l             ]

file2.c:

struct ll: [ pointer (next) | int (key)   ]
// so the passed struct is treated in the same way:
l:         [ 1           | &l             ]
              next          key
于 2012-04-01T04:30:31.730 に答える