Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
alkagolik
Заблокирован
1

Есть ли аналог realloc(), но расширяющийся в обратную сторону и возвращающий указатель на начало

15.11.2011, 23:00. Просмотров 2164. Ответов 12
Метки нет (Все метки)

встречный вопрос форумчанам. Есть ли аналог realloc(), но расширяющийся в обратную сторону и возвращающий указатель на начало. т.е. так
C
1
2
3
4
5
int *p = malloc(sizeof(int));
p[0] = 2;
p = somthing_realloc(p, 2 * sizeof(int));
p[0] = 10;
printf("%d %d", p[0], p[1]);
и на выходе получить 10 2.

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

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 23:00
Ответы с готовыми решениями:

Есть ли аналог exp, возвращающий long double?
Есть ли аналог exp, возвращающий long double?

FOR в обратную сторону
Как в с++ сделать for наоборот? ну то есть не от 1 к n, а от n к 1. подскажите, прошу. ...

Видео в обратную сторону
Здравствуйте, уважаемые форумчане! :) Сразу хочу сказать, что в обработке видео я полный нуб,...

Елочка из # в обратную сторону
Доброй ночи, уважаемые форумчане. Есть простой код, который выводит елку из решеток, как переделать...

MAX_COUNT в обратную сторону
как заставить этот код, дойдя до MAX_COUNT, работать в обратную сторону, т.е. count-1 ? public...

12
OstapBender
587 / 525 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
15.11.2011, 23:04 2
realloc не расширяется в какую-то сторону. он имеет право как выделить память в той же самой области, так и в любой другой где есть нужное количество...
1
alex_x_x
бжни
2456 / 1664 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.11.2011, 23:11 3
OstapBender, вообщето
The realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. The contents of the new
object shall be the same as that of the old object prior to deallocation, up to the lesser of
the new and old sizes.
Any bytes in the new object beyond the size of the old object have
indeterminate values.
насчет вопроса - нет конечно нету
использовать realloc + memcpy/memmove
1
alkagolik
Заблокирован
15.11.2011, 23:15  [ТС] 4
man realloc
MALLOC(3) Руководство программиста MALLOC(3)



НАЗВАНИЕ
calloc, malloc, free, realloc - Выделение и освобождение динамической памяти

СИНТАКСИС
#include <stdlib.h>

void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);

ОПИСАНИЕ
calloc() выделяет память для массива из nmemb элементов по size байт каждый, и
возвращает указатель на выделенную память. Выделенная память обнуляется.

malloc() выделяет size байт и возвращает указатель на выделенную память. Выделенная
память не инициализируется.

free() освобождает область памяти, на которую указывает ptr, которая быть выделена
ранее посредством malloc(), calloc() или realloc(). Иначе, если free(ptr) был уже
вызван ранее, результат операции не определен. Если ptr равен NULL, то ничего не
происходит.

realloc() изменяет размер блока динамической памяти, на который указывает ptr.
Новый размер блока будет равен size байт.
Его содержимое останется неизменным в
промежутке вплоть до прежнего или нового размера, смотря что меньше; добавленная
память не инициализируется. Если ptr равен NULL, то результат вызова эквивалентен
malloc(size); если size равен нулю, то результат вызова эквивалентен free(ptr).
Кроме случая, когда ptr равен NULL, он должен указывать на память, выделенную ранее
посредством malloc(), calloc() или realloc().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
calloc() и malloc() возвращают указатели на выделенную память, выровненную так, что
их можно использовать для переменных любого типа. При неудаче выделения
возвращается NULL.

free ничего не возвращает.

realloc() возвращает указатель на новый участок памяти, выровненный так, что его
можно использовать для переменных любого типа
, причем этот новый указатель может
отличаться от ptr. Если запрос выполнить не удается или новый размер равен нулю,
возвращается NULL. Если вызов realloc() завершился неудачно, то старый блок памяти
остается нетронутым: он не освобождается и не перемещается.

СООТВЕТСТВИЕ СТАНДАРТАМ
ANSI-C

СМОТРИ ТАКЖЕ
brk(2)

ЗАМЕЧАНИЯ
Стандарт Unix98 требует, чтобы malloc(), calloc() и realloc() устанавливали
переменную errno в значение ENOMEM в случае неуспешного выделения памяти. Glibc
полагает, что это условие выполняется (и для glibc-версии этих функций это так);
если же вы используете реализацию, не устанавливающую errno, то некоторые функции
библиотеки могут завершаться ошибочно, не зная причины неудачи.

Сбои внутри malloc(), free() или realloc() в большинстве случаев вызваны
нарушениями структуры хипа, такими как запись за границы выделенного участка или
повторное освобождение памяти по одному и тому же указателю.

Последние версии Linux libc (новее, чем 5.4.23) и GNU libc (2.x) включают в себя
реализацию функций управления памятью, настраиваемую через переменные окружения.
Когда установлена MALLOC_CHECK_, используется специальная (и менее эффективная)
реализация, которая разработана с целью быть более устойчивой к небольшим ошибкам,
таким как двойной вызов free() с одинаковым аргументом, или переполнениями на один
байт. Это, тем не менее, обеспечивает защиту не от всех ошибок, которые могут
привести к утечкам памяти. Если MALLOC_CHECK_ установлена в 0, все замеченные
нарушения структуры хипа игнорируются; если установлена в 1, диагностика печатается
на stderr; если установлена в 2, то немедленно вызывается abort(). Это может быть
полезным, так как иначе реальный сбой мог бы произойти много позже, и истинную его
причину было бы в этом случае очень трудно найти.

ПЕРЕВОД
Перевод с английского (C) 2000 Дмитрий Морожников
(dm@simplex.irkutsk.ru, 2:5070/141.3)



GNU Апрель 4, 1993 MALLOC(3)
0
15.11.2011, 23:15
OstapBender
587 / 525 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
15.11.2011, 23:19 5
я не понял что вы оба хотели сказать выделенными местами.
0
alex_x_x
бжни
2456 / 1664 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.11.2011, 23:22 6
OstapBender, если мне не кажется, то сообщение имело первоначально другое содержание
0
OstapBender
587 / 525 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
15.11.2011, 23:28 7
моё? нет, я его не трогал...
0
alkagolik
Заблокирован
15.11.2011, 23:42  [ТС] 8
так, давай внесу ясность. Сразу недодуманный вопрос сбил всех с толку. Поскольку функция оперирует указателями, то конечно не имеет значения где выделяется память в которой хранятся данные, а вот память в которой хранятся указатели по логике вещей просто обязана быть непрерывной. И мы имеем сохранение начального адреса указателя и так называемое "расширение" конечного адреса указателя, а меня интересует как раз обратная ситуация, когда конечный указатель остается неизменным, а начальный минусуется. Т.е. я говорю не о блоке с данными, а о блоке с указателями. Из этого примера
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int *p = malloc(sizeof(int));
    printf("%p\n", p);
    p = realloc(p, 2 * sizeof (int));
    printf("%p\n%p\n", p, p + 1);
    p = realloc(p, 4 * sizeof (int));
    printf("%p\n%p\n", p + 2, p + 3);
    free(p);
    return 0;
}
видно что адреса указателей расположены друг за другом последовательно. Ну а суть вопроса изложена, хотя наверное зря поднял вопрос...
0
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
15.11.2011, 23:57 9
Цитата Сообщение от alkagolik Посмотреть сообщение
И мы имеем сохранение начального адреса
это не гарантируется, функция может выделить память совершенно в другом месте, и начальный адрес изменится

Добавлено через 6 минут
попробуйте например такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int *p = malloc(sizeof(int) * 16);
    printf("%p\n", p);
    int *t = malloc(1000);
    p = realloc(p, sizeof (int) * 32);
    printf("%p\n", p);
    free(p);
    return 0;
}
1
alkagolik
Заблокирован
16.11.2011, 00:36  [ТС] 10
Net_Wanderer, да, так, но суть не меняется.

Добавлено через 3 минуты
кстати арифметическая разница адресов обрисовывает ситуацию.
0
bob2005
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 10
16.11.2011, 14:59 11
Цитата Сообщение от alkagolik Посмотреть сообщение
man realloc
А где Вы взяли этот перевод? Кинте ссылочку или файл выложите.
Пожалуйста.
0
alkagolik
Заблокирован
16.11.2011, 17:30  [ТС] 12
bob2005, это manpages-ru
0
Сыроежка
Заблокирован
16.11.2011, 17:39 13
Цитата Сообщение от alkagolik Посмотреть сообщение
так, давай внесу ясность. Сразу недодуманный вопрос сбил всех с толку. Поскольку функция оперирует указателями, то конечно не имеет значения где выделяется память в которой хранятся данные, а вот память в которой хранятся указатели по логике вещей просто обязана быть непрерывной. И мы имеем сохранение начального адреса указателя и так называемое "расширение" конечного адреса указателя, а меня интересует как раз обратная ситуация, когда конечный указатель остается неизменным, а начальный минусуется. Т.е. я говорю не о блоке с данными, а о блоке с указателями. Из этого примера
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int *p = malloc(sizeof(int));
    printf("%p\n", p);
    p = realloc(p, 2 * sizeof (int));
    printf("%p\n%p\n", p, p + 1);
    p = realloc(p, 4 * sizeof (int));
    printf("%p\n%p\n", p + 2, p + 3);
    free(p);
    return 0;
}
видно что адреса указателей расположены друг за другом последовательно. Ну а суть вопроса изложена, хотя наверное зря поднял вопрос...
realloc работает просто. Она выделяет новую область памяти и копирует в нее из старой области памяти столько элементов, сколько может вместиться в новой области памяти. Так что то, что вы задумали, с помощью realloc сделать нельзя. Но тем не менее вы сами можете смоделировать работу realloc таким образом, как вам нужно. То есть выделяете память с помощью ,malloc и сами копируете в новую память те элементы, которые вам нужны.
1
16.11.2011, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 17:39

СЛАУ в обратную сторону
Задание: Решить СЛАУ исходные данные брать из файла , ответы записать в файл. Произвести проверку...

Кнопка в обратную сторону
Вот кнопка вперед, как сделать кнопку назад? function echo (n){ text = ''; for (var i = n*po;...

СМА Атлант 1040т1 (аналог Ardo S1000x) не крутит в одну сторону, не вращается двигатель в одну сторону
СМА Атлант 1040т1 модуль 546059301 не вращает барабан в одну сторону. Проверил резисторы R51a R51b...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru