Порядок объявления структуры, изменяющей вывод - PullRequest
0 голосов
/ 01 апреля 2012

Я не могу понять странное поведение этой программы. У меня есть 2 файла, file1.c и file2.c

file.c is

#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);
 }

Теперь, когда я компилирую и запускаю его, он показывает ошибку сегментации. Но где, как в file2.c, если я заменю struct ll на:

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

Тогда все работает нормально. Я имею в виду, просто меняя порядок объявления, это влияет на результат.

1 Ответ

1 голос
/ 01 апреля 2012

Объявление структуры должно быть одинаковым оба раза, так как структура - это просто расположение данных в памяти, и вы переключаете переменные.

, в вашем случае код в функции 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
...