Как правильно ссылаться на две структуры в C? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть структура, определенная как:

typedef struct{
       int pages;
    }book;

Сначала я объявляю экземпляр:

book *b=malloc(sizeof(book));
b->pages=35;

Затем я объявляю другой указатель книги как:

book *a;
a=&b;

После отладки я вижу, что член в структуре a не похож на b?Я получаю ложное значение для pages в a.

Разве не предполагается, что a указывает на память b?Как правильно разыменовать a?Извините, если я не правильно понял концепцию указателей.

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

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

book **a;  //a is a second level pointer
a=&b;      //Now a is pointing to the address of b itself,Because b has an address
0 голосов
/ 27 августа 2018

То, что вы здесь делаете, сохраняет адрес b в a.При разыменовании a теперь вы получаете то, что хранится в b, который является адресом того места, где хранится ваша книга, а не самой книгой.На самом деле, я думаю, что вы должны получить ошибку сегментации при попытке доступа к a->pages, потому что эта память даже не была выделена.

Так что я думаю, что вы хотите сделать здесь, это сделать a указатель ната же самая структура book, что и b, которую вы можете получить, выполнив

book *a = b;
0 голосов
/ 27 августа 2018

Что вы делаете с этой строкой:

a=&b;

- назначить указатель на book указателю на book.

Обычно компилятор выдаст ошибку, которая будет выглядеть примерно так:

 error: cannot convert 'book**' to 'book*' in assignment.

Но похоже, что вы напрямую запустили его в режиме отладки. Поэтому хорошо скомпилировать код, удалить все ошибки и предупреждения, а затем начать отладку.

0 голосов
/ 27 августа 2018

Для этого вам нужно сделать a указателем на указатель, потому что b является указателем.

book **a;
a=&b;

Вы можете сделать, как показано ниже, с помощью a, используя только указатель.

book *a;
a=b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...