Вот код, который работает без ошибок,
struct Node{
int data;
struct Node* next;
}n1;
void main(){
int *head = NULL;
head = &n1;
// more code..
}
Разве не неправильно сохранить адрес структуры в указателе, который должен сохранять целочисленный адрес. Я должен был инициализировать его как struct Node* head = NULL;
Неужели этот адрес чего-либо требует для сохранения одинакового места? (Все типы связаны с выделенным пространством, не так ли?)
2 ответа
Это логическая ошибка, а не проблема синтаксиса. Обычно компилятор не должен выдавать никаких сообщений об ошибках.
Здесь вы помещаете адрес &n1
в переменную-указатель head
, которая является синтаксически допустимой. У компилятора нет причин выдавать ошибку. Однако он должен [ должен ] выдавать предупреждающее сообщение о несовместимости типов данных.
Итог: Включите предупреждения в своем компиляторе и обратите внимание на выдаваемые предупреждения. Они здесь для ответа.
Этот код плохо сформирован. Назначение может быть выполнено только между указателями несовместимого типа, если один из них - void *
. Компилятор должен выдать диагностическое сообщение
Однако это допустимо (и если ваш компилятор выдает «предупреждение» только для исходного кода, то, возможно, он преобразует код в этот и продолжает работу):
head = (int *)&n1;
Затем вы можете работать с head
так же, как если бы вы написали head = &n1.data;
.
Проблема с выравниванием отсутствует, потому что структура всегда правильно выравнивается для своего первого члена. Проблема со строгим псевдонимом отсутствует, потому что lvalue *head
имеет тип int
, а данные, для которых назначается псевдоним, имеют эффективный тип int
; и int
совместим с int
. (Неважно, что один int
является членом структуры, а другой - нет).
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.