Вот код, который работает без ошибок,

struct Node{
  int data;
  struct Node* next;
}n1;

void main(){
    int *head = NULL;
    head = &n1;
    // more code..
}

Разве не неправильно сохранить адрес структуры в указателе, который должен сохранять целочисленный адрес. Я должен был инициализировать его как struct Node* head = NULL;

Неужели этот адрес чего-либо требует для сохранения одинакового места? (Все типы связаны с выделенным пространством, не так ли?)

-1
Anil Bhaskar 10 Мар 2015 в 13:42

2 ответа

Лучший ответ

Это логическая ошибка, а не проблема синтаксиса. Обычно компилятор не должен выдавать никаких сообщений об ошибках.

Здесь вы помещаете адрес &n1 в переменную-указатель head, которая является синтаксически допустимой. У компилятора нет причин выдавать ошибку. Однако он должен [ должен ] выдавать предупреждающее сообщение о несовместимости типов данных.

Итог: Включите предупреждения в своем компиляторе и обратите внимание на выдаваемые предупреждения. Они здесь для ответа.

1
Sourav Ghosh 10 Мар 2015 в 11:13

Этот код плохо сформирован. Назначение может быть выполнено только между указателями несовместимого типа, если один из них - void *. Компилятор должен выдать диагностическое сообщение

Однако это допустимо (и если ваш компилятор выдает «предупреждение» только для исходного кода, то, возможно, он преобразует код в этот и продолжает работу):

head = (int *)&n1;

Затем вы можете работать с head так же, как если бы вы написали head = &n1.data;.

Проблема с выравниванием отсутствует, потому что структура всегда правильно выравнивается для своего первого члена. Проблема со строгим псевдонимом отсутствует, потому что lvalue *head имеет тип int, а данные, для которых назначается псевдоним, имеют эффективный тип int; и int совместим с int. (Неважно, что один int является членом структуры, а другой - нет).

2
M.M 10 Мар 2015 в 11:24