2015-11-19 2 views
-2

вот моя странная проблема:в C Структуры рассматриваются в качестве указателей

У меня есть некоторый код, где раньше основной(), я объявляю несколько структур, как глобальные переменные. Функции, которые я использую для структур в main(), обычно требуют указателей на реальные аргументы, и поэтому наивно, я ввожу, например.

функция (& struct.content);

Затем я получаю сообщение об ошибке, говоря, что это неправильный тип аргумента, потому что это двойной указатель (**) вместо одного (*). Затем, когда я беру амперсанд , он работает! Другими словами, эти структуры обрабатываются так, как если бы они были уже указателями, и я думаю, что это в конечном итоге вызывает проблемы с распределением памяти позже в коде.

Я действительно ценю любое освещение, которое любой может обеспечить! Я просто ученый, а не настоящий программист, и такие вещи продолжаются, чтобы укусить меня :(

+13

Показать минимальный пример кода, который демонстрирует проблему. –

+0

Не могли бы вы вставить некоторый * настоящий * код? 'struct.content' не имеет никакого смысла, поскольку' struct' является ключевым словом. – Bathsheba

+1

Я предполагаю, что 'content' объявлен как некоторый указатель (или массив) в определении' struct'. В этом случае это не структура, действующая как указатель, это фактические данные внутри структуры, действующей как указатель (потому что она одна или может деградировать до одного). Вы бы передали '& somestruct.content' только если вам нужен указатель на указатель, хранящийся в самой структуре (скажем, если он может« переделать »его или что-то еще и будет обновлять структуру на месте). – ShadowRanger

ответ

1

Указатель указывает на вещи. Представьте, что вы командир, и вы указываете на кого-то. солдат убивает то, на что вы указываете, и солдат убивает этого человека. Этот человек сейчас мертв.

Одна из распространенных ошибок, которую разработчики могут сделать, - это продолжать указывать на этого умершего человека и управлять солдату (компьютеру), чтобы допросить человека, на которого вы все еще указываете. Это становится проблемой, так как человек действительно мертв. Затем солдат становится очень смущенным и начинает получать ПТСР после попытки опросить мертвого человека и не получить ответа.

enter image description here

Теперь в вашем случае, за исключением вопросов, как указатель недействительность (висячие указатели), управление памятью и т.д. - если у вас есть функция, которая хочет указатель, вы просто дать ему указатель (или что-то, распадающуюся к одному, как массив). .

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

function(some_struct.content); 

... затем проверьте content член структуры и посмотрите, является ли это указателем. Если это так, вы правильно передаете аргумент, и нет ничего плохого в этом конкретном фрагменте кода (хотя вы можете делать что-то неправильно с данными, которые указывают content).

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

Смежные вопросы