LINUX.ORG.RU

[gnu c] как узнать на какой кусок памяти ссылается указатель?


0

0

привет знатокам! вот предположим я объявляю указатель следующим образом:

void *p=malloc(10);

как узнать после на какое количество памяти этот указатель ссылается? для обычных типов(не ссылочных) это можно сделать с помощью sizeof(). а как такое сделать для указателя? не может быть такого что это невозможно узнать! гугл пока не помог.

я хочу в итоге получить функцию вида

int me_sizeof(void*p);


нужно запоминать самому сколько чего и куда ты выделяешь. GNU C.

ei-grad ★★★★★
()

>как узнать после на какое количество памяти этот указатель ссылается?

Зачем?

Led ★★★☆☆
()

Тоже интересно: зачем тебе это?

Если сильно нужно, то можешь заменить malloc на свой, который перед блоком выделенной памяти будет хранить объём выделенной памяти. Типа такого:

void *mymalloc(size_t sz);
{
    size_t *p = malloc(sz + sizeof(*p));
    *p = sz;
    return p + 1;
}

size_t getmemsz(const void *p)
{
    return *((const size_t *) p - 1);
}

void myfree(void *p)
{
    if (p)
        free((size_t *) p - 1);
}

Deleted
()

Можешь попробовать расковырять realloc. Но не надо этого делать.

Решаемая задача - моветон.

ttnl ★★★★★
()

Про чётные указатели в массиве тоже твой тред?
Если да, то хочу сразу сказать что ты явно где-то не туда повернул по жизни.

tia
()
Ответ на: комментарий от tia

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

Puld
() автор топика
Ответ на: комментарий от Deleted

>перед блоком выделенной памяти будет хранить объём выделенной памяти.

Поцкаль не нужен.

anonymous
()
Ответ на: комментарий от Deleted

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

Puld
() автор топика
Ответ на: комментарий от anonymous

>Поцкаль не нужен.

спасибо за поддержку:)

Puld
() автор топика
Ответ на: комментарий от Puld

запоминает, но реализация у всех своя - так что универсального способа нет

П.С. как тебе уже сказали - ты хочешь странного

lester ★★★★
()
Ответ на: комментарий от lester

ладно, открою военную тайну! мне это нужно чтобы успокоиться что malloc выделил именно столько памяти сколько мне нужно. сомнения в «честности» malloc у меня появились после прочтения вот этого http://www.opennet.ru/man.shtml?topic=malloc&russian=0&category=&submit=%F0%C...

а именно: «Linux следует крайне самоуверенной стратегии распределения памяти. Это означает, что когда malloc() возвращает ненулевое значение, нет никаких гарантий, что память в действительности доступна. Если обнаружится, что системе не хватает памяти, то один или несколько процессов будут подло убиты OOM.»

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

Puld
() автор топика
Ответ на: комментарий от anonymous

вот гугл чтото выдал http://www.insidepro.com/kk/197r.shtml и у меня вопрос, а как это делается в ядре? проверка выделения памяти, валидности указателей...

просто пишу очень радом с ядром и мне нужна гарантия что прога не хакнется

Puld
() автор топика
Ответ на: комментарий от Puld

Посмотри настоящий ман и если у тебя не 5 слака то все будет ок :) вон и лестер уже написал :)

anonymous
()
Ответ на: комментарий от tia

нет не лень:) это не я. но у меня бывают мысли и более безумные))))))

Puld
() автор топика
Ответ на: комментарий от Puld

Затри всю выделенную память нулями, если в процессе получишь сигнал(SIGBUS afaik) - значит ты нарвался на нехватку памяти. Но imho лучше на это не закладываться. Не особо представляю себе, что ты будешь делать с ценным знанием о нехватке памяти кроме как падать.

YesSSS ★★★
()
Ответ на: комментарий от Puld

>>не, я хочу именно узнать сколько выделено памяти под этот указатель

этими проверками ты ничего не добьёшся.

alex_custov ★★★★★
()
Ответ на: комментарий от lester

>программы на жабе не требуют много памяти?

просто ее там никогда не бывает достаточно.

goose
()
Ответ на: комментарий от YesSSS

>>то ты будешь делать с ценным знанием о нехватке памяти кроме как падать.

некоторые недалёкие программисты показывают предупреждения и делают откат ;)

alex_custov ★★★★★
()
Ответ на: комментарий от lester

где можно посмотреть на аналог GNU/Linux на лиспе?

Не, ну на самом деле: как можно писать программы, не зная, как работает аппаратура хотя бы в самых общих чертах? Виртуальная, там, память, как она соотносится с физической, и т.п.

mv ★★★★★
()
Ответ на: комментарий от lester

так он же ж на С написан!

Только прослойка взаимодействия с осью и элементарные операции, которие при интерпретации байткода работают дюже медленно. И, кстати, Genera и CADR раньше Линукса появились.

mv ★★★★★
()
Ответ на: комментарий от lester

а elisp?

Ты имеешь в виду виртуальную машину?

mv ★★★★★
()
Ответ на: комментарий от lester

>программы на жабе не требуют много памяти?

я не сказал, что не появится других проблем. но данная - точно отпадет :)

lester_dev ★★★★★
()
Ответ на: комментарий от alex_custov

>некоторые недалёкие программисты показывают предупреждения и делают откат

поздно делать откат. когда разбудили OOM-killerа.

dn2010 ★★★★★
()
Ответ на: комментарий от alex_custov

> некоторые недалёкие программисты показывают предупреждения и делают откат ;)

Если известно куда делать откат - почему нет. Я ответил тс-у, как убедиться в выделенности памяти (реальное выделение страниц происходит при первом использовании). =)

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

вопрос в лоб! возможно ли, хотя бы самую малость, что маллок выделит не 10 байт как я хотел, а, скажем, 8? или он сам отследит это и за место 8ми имеющихся байт выдаст NULL?

Puld
() автор топика
Ответ на: комментарий от Sylvia

ладно, соглашусь, malloc'у можно доверять, он не врет:))) но как узнать размер выделенной памяти для указателя, вопрос открытый!

Puld
() автор топика
Ответ на: комментарий от Sylvia

ps: для параноиков можно выделять память не malloc() , а calloc() ;)

Sylvia ★★★★★
()

ты понимаешь, что если физической памяти в компьютере 256 мб, то можно сделать malloc на 500 мб, и они выделятся и ты все эти 500 мб сможешь реально использовать? Потому что есть своп. В твоем понимании сколько памяти выделилось в этом случае?

Ситуация с overcommit такая же, просто своп внезапно кончается.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Я ЗНАЮ ЧТО ИДЕЯ БРЕДОВАЯ, НО ДОВОЛЬНО ИНТЕРЕСНАЯ ДЛЯ МЕНЯ!

мне просто стало интересно определять выделенный размер по указателю. нашли указатель, хопа! и узнали на какой объем памяти он ссылается.

если вас не интересует эта бредовая идея, можете не отвечать. а можете все же устроить мозговой штурм.

а если бы Столман в свое время слушал вопросы «зачем?», думаю вряд ли мы имели бы сейчас столь прекрасный язык! (простите за пафос)

Puld
() автор топика

мне просто стало интересно определять выделенный размер по указателю. нашли указатель, хопа! и узнали на какой объем памяти он ссылается.

Смотри, как работает аллокатор. При чём здесь язык?

mv ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

> >что если физической памяти в компьютере 256 мб, то можно сделать malloc на 500 мб, и они выделятся

не выделится

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

dilmah ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Как только процесс попросит столько памяти, ядро его пошлёт по дальше

Сфига? Пока физической памяти + свопа хватает, никто его не пошлёт.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.