Jump to content

Alocação dinamica


Localhost
 Share

Recommended Posts

Olá pessoal, alguém me podia explicar como é que eu aloco dinamicamente um vector e um vector multidimensional? Eu sei que quando alocámos algo dinamicamente a função por exemplo malloc devolve-nos um ponteiro do tipo void * para o primeiro byte da nossa alocação, no entanto não percebo várias coisas, porquê o cast? Já vi várias coisas diferentes sobre alocação de vectores e matrizes mas não sei qual é a mais correcta.

here since 2009

Link to comment
Share on other sites

void * malloc ( size_t size );

Allocate memory block

Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.

The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.

O malloc só reserva um espaço de memória de size bytes, independentemente do tipo de dados que pretendes utilizar nessa memória, daí o void*.

Visto que não consegues fazer nada com um void*, tens de fazer o cast para o tipo de dados em causa.

Ex:

#include <stdio.h>
#include <stdlib.h>
int main() {
int v[10];

/* variável inteira */	
int * i = (int *) malloc( sizeof(int) );
*i = 1;
i = v+5;

/* vector com N doubles */
int N = 10;
double * d = (double *) malloc( sizeof(double) * N );
d[5] = 5.12;
printf("%.5f\n", d[5]);

/* vector bidimensional, basicamente é vector de vectores */
char ** matriz;
int L = 5, C = 3 , j;
matriz = (char **) malloc( sizeof(char *) * L ); // vector de char*

for (j = 0 ; j < L ; j++)
	matriz[j] = (char *) malloc( sizeof(char) * C);

matriz[2][1] = '*';
return 0;
}

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Ah, já entendi! Obrigado. Só para confirmar o que tu fizeste: é o seguinte, na parte da matriz, alocaste espaço para 5 linhas e depois naquele loop cada vez que ele entrava numa linha tu alocavas a coluna correcto?

Edit°: Não percebi porque é que no loop for quando foste a alocar as colunas utilizaste um indice :s

Edit¹: Já percebi, porque tens de pôr em cada linha xD

here since 2009

Link to comment
Share on other sites

Aloca-se espaço para 5 linhas e depois para cada linha aloca-se o espaço para C colunas (o espaço não é alocado coluna a coluna).

Penso que o que disse já responde ao teu edit.

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Então é o seguinte: Ele aloca espaço para 5 linhas, depois cada vez que ele entra no laço aloca espaço para 3 colunas formando assim, de uma maneira estúpida, 3 quadrados por linha? LOL

Ou seja, é uma alocação por passos? Ele primeiro forma 5 vectores e depois forma uma matriz colocando 3 colunas? E não se podia fazer tipo alocar logo 15 colunas?

here since 2009

Link to comment
Share on other sites

Eu dei um exemplo de uma matriz LxC, mas podia não ser. Ex:

int **m = (int**) malloc(sizeof(int*) * 3);
m[0] = (int*) malloc(sizeof(int) * 1);
m[1] = (int*) malloc(sizeof(int) * 3);
m[2] = (int*) malloc(sizeof(int) * 2);

Ou seja, é uma alocação por passos? Ele primeiro forma 5 vectores e depois forma uma matriz colocando 3 colunas? E não se podia fazer tipo alocar logo 15 colunas?

Podias. Mas em primeiro lugar, nota que em C, a memória de uma matriz é alocada linha a linha. Ou seja,

char matriz[10][5];

matriz[1][2] = 89 é equivalente a colocar 89 na à posição 1*5+2 da memória alocada à matriz.

Senão me engano, o uso teria de ser algo como:

int L = 5 , C = 3;
#define getIndex(i,j)  i*C+j
...

int * m = (int*) malloc(sizeof(int) * 15);

m[ getIndex(1,2) ] = 89;

Eu vejo que já tens bastantes conhecimentos, mas parecem-me estar pouco sólidos. Caso não tenhas aulas de programação, eu aconselhava-te a arranjar um livro ou uma boa referência online e ir dando uma vista de olhos de modo a consolidar os conhecimentos.

Já agora que andas no secundário, dá uma vista de olhos neste tópico. Podias participar nas olimpiadas de informatica 🙂

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.