Как добавить в конец массива C - PullRequest
1 голос
/ 26 июня 2011

Я некоторое время программировал на target-c, но, к сожалению, я никогда не углублялся в C и указатели памяти, хотя у меня есть элементарное понимание их. Я работаю с массивом структур CLLocationCoordinate2D, и я пытаюсь выяснить, как добавить к массиву. Прежде всего, я получаю

NSString *aString; //a bunch of coordinates
CLLocationCoordinate2d *coordinates;
int length;

doSomethingCool(aString, &coordinates, &length);

после того, как я сделаю что-нибудь классное, я хочу сохранить это в переменной класса. Если я просто сделаю что-то вроде

points = newPoints

баллов содержит соответствующее содержание. Однако, если я попытаюсь сделать что-то вроде этого:

points = malloc(sizeof(CLLocationCoordinate2D) * length);
points[0] = *newPoints;

points заканчивается содержимым, отличным от newPoints .

В конечном итоге моя цель - иметь возможность добавлять баллов на основе длины , но я не смогу сделать это, если не смогу получить вышеуказанное код для работы. Что я делаю не так?

Ответы [ 2 ]

7 голосов
/ 26 июня 2011

Ваш код просто копирует первое значение newPoints в первое значение points (*newPoints эквивалентно newPoints[0]).

Одна из ситуаций - создать новый массив, скопироватьвсе значения, переключите массивы и освободите () старое.Например:

int* newvals = malloc(sizeof(int) * newcount);
memcpy(newvals, vals, sizeof(int) * oldcount);
free(vals);
vals = newvals;

Вы также можете использовать realloc - его поведение аналогично приведенному выше (хотя оно может дать сбой!), Но иногда может быть более эффективным.

Примечаниечто вы просто не можете изменить размер базового указателя безопасным и переносимым способом.Вам нужно будет обновить переменную вашего экземпляра ("class") новым указателем.

0 голосов
/ 26 июня 2011

Идея состоит в том, чтобы скопировать весь массив во временный массив, изменить размер оригинала и затем скопировать их обратно.Однако управление этим может стать волосатым.Вам лучше использовать std :: vector и просто добавить его.

РЕДАКТИРОВАТЬ: я только что понял, что вы используете C, а не C ++.Не обращайте внимания на вторую половину этого.

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