C - как я могу установить указатель массива обратно на первый байт памяти - PullRequest
0 голосов
/ 04 ноября 2011

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

Ответы [ 2 ]

6 голосов
/ 04 ноября 2011

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

Пример первого (пока игнорируя, что во всехв этих случаях вы печатаете неинициализированные значения, это, в конце концов, надуманный пример):

int *ip = malloc (10 * sizeof (*ip));

int *origIp = ip;

printf ("%d\n", *ip++);  // print and advance
printf ("%d\n", *ip++);  // print and advance

ip = origIp; free (ip);  // or just free (origIp) if you wish.

для второго:

int *ip = malloc (10 * sizeof (*ip));

int idx = 0;

printf ("%d\n", *ip++); idx++;  // print and advance
printf ("%d\n", *ip++); idx++;  // print and advance

ip -= idx; free (ip);

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

int *ip = malloc (10 * sizeof (*ip));

int idx = 0;

printf ("%d\n", ip[idx++]);  // print and advance
printf ("%d\n", ip[idx++]);  // print and advance

free (ip);

Большинство современных компиляторов в любом случае дадут вам один и тот же код под обложками.

5 голосов
/ 04 ноября 2011

Не существует автоматического способа - вы должны бесплатно передать исходное местоположение.

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

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