LINUX.ORG.RU

Мне главное видеть сколько памяти выделено и под какую переменную/указатель.

Было бы неплохо ещё выполнять программу ступенчато, как в gdb. И смотреть как меняется картина.

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

Что-то непонятное получилось. Или я чего-то не понимаю. Память была выделена в стеке. Как выделить её в куче? Пробовал выделять больше, но всё равно в стеке выделяется. WTF?

$ valgrind --tool=massif ./realloc
...
==12198== 
==12198== Total spacetime:   2,212,548 ms.B
==12198== heap:               0.0%
==12198== heap admin:         0.0%
==12198== stack(s):          99.8%

realloc.c:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

void checkp(void * p)
{
	if( p == NULL ) {
		printf("ERROR: Not enough memory\n");
		exit(1);
	}	
}

int main( int argc, char ** argv )
{
	//Store one number
	int n = 1;
	uint8_t *p;
	p = (uint8_t *) malloc(n * sizeof(uint8_t)); checkp(p);
	
	//Let's count
	int i;
	for(i=1; i<=255; i++)
	{
		if(i > n){
			//We need more memory
			n *= 2;
			uint8_t *np;
			np = (uint8_t *) realloc(p, n * sizeof(uint8_t)); checkp(np);
			printf("Reallocated memory to %i bytes. Memory address:%i\n", n * sizeof(uint8_t), np);
			p = np;
		}
		
		p[i-1] = i;
		printf("p[%i] = %u\n", i-1, p[i-1]);
	}

	free(p);
	return 0;
}

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

Выделил 40 мегов разом и увидел, что выделилось в heap
	
uint32_t *p = (uint32_t *) malloc(sizeof(uint32_t) * 1024 * 1024 * 10); //40 mb :-)
checkp(p);
free(p);

Но с realloc что-то не получается. Пишет, что в стеке. Выделил 32 мега. Я неправильно пользуюсь valgrind-ом?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void checkp(void * p)
{
    if( p == NULL ) {
        printf("ERROR: Not enough memory\n");
        exit(1);
    }    
}
int main( int argc, char ** argv )
{
    //Store one number
    int n = 1;
    uint16_t *p;
    p = (uint16_t *) malloc(n * sizeof(uint16_t)); checkp(p);
    
    //Let's count
    int i;
    for(i=1; i<=24; i++)
    {
        if(1){
            //We need more memory
            n *= 2;
            uint16_t *np;
            np = (uint16_t *) realloc(p, n * sizeof(uint16_t)); checkp(np);
            printf("Reallocated memory to %f MB. Memory address:%u\n", n * sizeof(uint16_t) / 1024.0 / 1024.0, np);
            p = np;
        }
        
        p[i-1] = i;
        printf("p[%i] = %u\n", i-1, p[i-1]);
    }
    free(p);
    return 0;
}

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