quarta-feira, 23 de março de 2011

Dicas de Programação: Entendendo posicionamento de memória em C/C++

Isso foi uma dúvida de um colega meu sobre alocação de memória em C/C++:

Vamos ver a seguinte instrução:

#include <stdio.h>
#include <malloc.h>

int main(int num_args, char** args) {
//Aloco na memória, um inteiro
int* inteiro = (int*)(malloc(sizeof(int)));
//Veja qual endereço de memória, ele alocou (Ex.: 4074488)
printf("%d\n", inteiro);
//Adiciona mais um no endereço, teoricamente vai para 4074489
inteiro++;
//Exibo o endereço (4074492 (???))
printf("%d\n", inteiro);
//Libero memória
free(inteiro);
//Espero um <enter> :P
getchar();
//Finalizo a função
return 0;
}

A dúvida: Por que diabos quando eu somo um em ponteiro, ele vai para um outro número nada a ver?

Não é bem assim...
Quando eu somo +1, ele vai para o próximo endereço que é alocavel para um inteiro, ou seja, se o tamanho do inteiro é 4 bytes (em gcc, eu acho que é...), então se tenho o endereço 4074488, se eu somar +1, ele vai para 4074492, 4 bytes a mais, por causa que o que ele tem que alocar é um inteiro.

Se eu utilizar um char em vez de inteiro no código:

#include <stdio.h>
#include <malloc.h>

int main(int num_args, char** args) {
char* b = (char*)(malloc(sizeof(char)));
printf("%d\n", b);
b++;
printf("%d\n", b);
free(b);
getchar();
return 0;
}

Agora vai "aparecer corretamente", pois o char em gcc é um byte (eu acho...), então se tenho 4074488 se somo +1 no endereço, ele vai para 4074489 :)

Até mais!

Um comentário:

Unknown disse...

Muito bom Take! Continue postando mais coisas sobre C/C++ :)


Sem querer pedir muito, você poderia, quando tiver tempo, dar uma olhada no OGRE (http://www.ogre3d.org/) e fazer uma anális? :)