LINUX.ORG.RU

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


0

0

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

void *p=malloc(10);

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

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

int me_sizeof(void*p);


Ответ на: комментарий от Boy_from_Jungle

попробуй - посмотришь.

$ free
             total       used       free     shared    buffers     cached
Mem:        502260     116500     385760          0      12564      53708
-/+ buffers/cache:      50228     452032
Swap:      1179632          0    1179632

$ cat malloc.c
#include <stdio.h>

int main(int argc, char* argv[])
{
    void* ptr = malloc(768 * 1024 * 1024);
    printf("ptr = %p\n", ptr);
    return 0;
}

$ gcc -o malloc malloc.c && ./malloc
ptr = 0x7f81cde93010
mv ★★★★★
()
Ответ на: комментарий от Puld

Нельзя это сделать, так как выделяется виртуальная память, а не физическая. В proc есть параметр, который отвечает за то, сколько виртуально памяти можно выделить malloc'ом в процентах от физической. По умолчанию ограничений нет.

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

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
void* ptr = malloc(768 * 1024 * 1024);
if(!ptr) { perror(""); exit(-1); }
printf(«ptr = %p\n», ptr);
return 0;
}

$./a.out
Cannot allocate memory

$free
total used free shared buffers cached
Mem: 1027648 991584 36064 0 55900 398028
-/+ buffers/cache: 537656 489992
Swap: 487868 60 487808

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от mv
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 8125
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 8125
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Выделится, так как выделяется _виртуальная_ память.

Reset ★★★★★
()

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

Слушай, а может ты просто gdb хочешь, но сказать не можешь? Там и указатели рассматривать можно, и стек, и память?

anonymous
()

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

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

изучи с++ --- вопросы отпадут

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

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

Ну мой это был пост и что с этого. Я учусь батенька и это нормально когда появляются вопросы,пускай и дурацкие. И вообще не тебе об этом судить туда ли я повернул.

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

> > пиши на жабе. и проблема отпадет сама собой.

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


Программы на жабе не пишут «рядом с ядром»©

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

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

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


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



Что интересно - никто не задался вопросом «при чём здесь Столлман»? )))

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

>изучи с++ --- вопросы отпадут

позволю себе напомнить что вопрос задан относительно gnu c. никакого c++!

Слушай, а может ты просто gdb хочешь, но сказать не можешь? Там и указатели рассматривать можно, и стек, и память?

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

а Столлмана я вспомнил потому что мужиг хороший и дело хорошее сделал. не ленина же вспоминать))

ЗЫ многим ученым у виска пальцем вертели, а они нобилевки получили. но это я не о себе))))

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

> да и ответа пока никто толком не дал и сам не нашел.

А что тут сложного? Открываешь исходники менеджера памяти («хипа») в твоей библиотеки языка Си и смотришь на её управляющие структуры. Всё.

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

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

например?

jtootf ★★★★★
()

Используйте shmget, тогда при помощи shmctl можно узнать размер выделенной памяти. А если хотите все-таки с malloc'ом - читайте исходники: как free узнает размер освобождаемой памяти.

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

во! первый дельный совет! спасибО!

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

>Используйте shmget, тогда при помощи shmctl можно узнать размер выделенной памяти. А если хотите все-таки с malloc'ом - читайте исходники: как free узнает размер освобождаемой памяти.

Задался тут вопрос, откуда собственно free будет знать сколько было выделено и как ни странно - нашел ответ http://www.c-faq.com/malloc/freesize.html - для Ъ malloc кладет рядом с выделеной памятью ее колличество, как тут в общем-то кто-то уже писал, с какой стороны от выделенного блока правда не написано, и вероятно зависит от реализации.

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

> Задался тут вопрос, откуда собственно free будет знать сколько было выделено и как ни странно - нашел ответ http://www.c-faq.com/malloc/freesize.html - для Ъ malloc кладет рядом с выделеной памятью ее колличество, как тут в общем-то кто-то уже писал, с какой стороны от выделенного блока правда не написано, и вероятно зависит от реализации.

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

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

Отключи swap и делай после malloc memset. Eсли после memset программа не упала, значит память действительно есть ))

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

> Отключи swap и делай после malloc memset. Eсли после memset программа не упала, значит память действительно есть ))

не, как то не практично

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

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

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

struct mem{
long size;
void *ptr;
}
и свои обертки
void *mymalloc(long size){
void *ptr0 = malloc((size_t)(sizeof(struct mem)+size));
struct mem *ptr = ptr0;
ptr->size = size;
ptr->ptr = ptr0[sizeof(struct mem)];
return ptr->ptr;
}
void myfree(void *ptr){
struct mem *ptr0 = ptr - sizeof(struct mem);
free(ptr0);
}
long mygetsize(void *ptr){
struct mem *ptr0 = ptr - sizeof(struct mem);
return ptr0->size;
}
Писал без проверки, так что возможны очепятки.

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

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

почему разработчики не реализовали это в API? вопросы безопасности?

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

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

По крайней мере получение информации о размере памяти из внутренностей malloc не дает никакой уверенности вообще.

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

Чуть более красивый способ - использовать mlock(2).

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

Потому что на самом деле это никому не нужно. И в этой теме задача поставлена исключительно из-за непонимания как работает виртуальная память.

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

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

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

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