2013-10-24 2 views
0

Я только что начал программировать на C несколько дней назад. Теперь я пытаюсь изучить структуры.C struct malloc и массив реализации указателей

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

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

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

+0

(Я уже видел этот вопрос сегодня .... вы или кто-то еще недавно опубликовали этот код). – abelenky

+0

Да, это была, наверное, моя подруга Сара. Она работает над тем же упражнением, что и я. У нее были некоторые ошибки компиляции, которые я, к счастью, не сделал: D Однако я не уверен, как улучшить код. – Sarah

ответ

1

Если вы хотите people быть массивом указателей, вы должны объявить его как это:

struct person *people[12]; 

Помните, что заявление следует использовать и что разыменования имеет более низкий приоритет, чем индексация массива; это означает, что *people[i] имеет тип struct person, и, таким образом, people[i] является указателем на struct person.

Для инициализации каждой позиции в people вы вызываете malloc(), чтобы ваши указатели указывали на допустимую ячейку памяти, достаточную для хранения struct person. Это так же просто, как:

people[i] = malloc(sizeof(struct person)); 

Когда вам не нужен people больше, вы должны помнить, чтобы освободить каждую позицию памяти вы выделенная путем вызова free(people[i]) для каждой позиции i.

Я заметил, что вы объявили массив для хранения 12 структур. Это может быть опасно, когда кто-то изменяет код: он не будет работать, когда HOW_MANY больше 12. Вы должны объявить массив того же размера:

struct person *people[HOW_MANY]; 

Это гарантирует, что ваш массив всегда имеет ровно пространство, необходимое.

UPDATE: Вы должны объявить insert как получающее массив указателей вместо массива структур:

static void insert (struct person *people[], char *name, int age) { ... }

И people[i].name недействителен. Поскольку people[i] является указателем сейчас, что вам нужно сделать это следующим образом:

people[i]->name 

Или, что то же самое, (*people[i]).name.

То же самое применимо к people[i]->age. Не забудьте изменить это как в main(), так и внутри insert.

Кроме того, перейдите i в insert вместо переменных static, если у вас нет веских оснований для этого. Статические переменные используются для функций с внутренним состоянием, и для меня insert - не совсем тот тип функции, в котором вы хотели бы этого.

+0

Спасибо за ответ Филипе! Я предполагаю, что мне нужен цикл for, чтобы включить бесплатный вход, верно? – Sarah

+0

Да, к тому времени, когда вам не нужны «люди», вам нужно будет сделать цикл, подобный 'for (i = 0; i

+0

Я отредактировал код к тому, что вы предложили, но, видимо, в нем есть ошибка. Я получаю исключение несовместимого типа указателя. – Sarah

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