Указатели на C и как передавать локальные переменные как указатели - PullRequest
0 голосов
/ 28 ноября 2010

Я все еще новичок в C. Я использую его на регулярной основе, но, как правило, не использую функции указателей C. Я пытаюсь сделать так, чтобы указатели передавались структурам, которые уже существуют в локальном пространстве. внутри функции. У меня есть этот код:

struct WorldCamera p_viewer;
struct Point3D_LLA p_subj;
struct Point2D_CalcRes p_res;
p_viewer.hfov = 25;
p_viewer.vfov = 25;
p_viewer.p.lat = 10.0f;
p_viewer.p.lon = 10.0f;
p_viewer.p.alt = 100.0f;
p_subj.lat = 9.98f;
p_subj.lon = 10.0f;
p_subj.alt = 100.0f;
// Do something interesting here.
compute_3d_transform(&p_viewer, &p_subj, &p_res, 10000.0f);
// Do something interesting here.

Прототип compute_3d_transform таков:

void compute_3d_transform(struct WorldCamera *p_viewer, struct Point3D_LLA *p_subj, struct Point2D_CalcRes *res, float cliph);

Я хочу знать, правильно ли я это понял. Я программирую на небольшом микроконтроллере, который, как мне кажется, не имеет большой защиты памяти. Повреждение одного фрагмента памяти может привести к появлению в будущем странных ошибок, которые будет очень трудно отладить. Я пытаюсь избежать использования функции malloc / calloc, поскольку для этого требуется выделенная куча.

Ответы [ 3 ]

5 голосов
/ 28 ноября 2010

Используйте адрес оператора &.

Ах, да, вы правильно поняли.

Причина, по которой вы правы, заключается в том, что, например, &p_viewer - это указатель, который указывает (например, на локальную) переменную p_viewer, которая является struct WorldCamera. И compute_3d_transform хочет указатель на struct WorldCamera, поэтому ваши намерения как вызывающего абонента совпадают с намерениями вызываемого.

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

1 голос
/ 28 ноября 2010

Я предполагаю, что ваша compute_3d_transform функция записывает свой результат в p_res - если это все, что вы делаете, ваш код в порядке.

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

0 голосов
/ 28 ноября 2010

Ваш код правильный, и повреждение памяти маловероятно.

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

Все сводится к знанию того, что происходит с вашими указателями. Функция compute_3d_transform, скорее всего, использует параметры просмотра и субъекта в качестве входных данных и заполняет область, на которую указывает параметр результата. Он не хранит указатели, поэтому они могут быть использованы позже, поэтому после завершения compute_3d_transform побочных эффектов не будет. (Параметры указателя, которые используются только в качестве входных данных, обычно помечаются const, чтобы пометить целевую область как постоянную для целей этой функции.)

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