Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Localhost

Alocação dinamica

Recommended Posts

Localhost

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

Share this post


Link to post
Share on other sites
mogers
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.

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
mogers

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.

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
mogers

Porque é que dizes "de maneira estúpida" ?


"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.

Share this post


Link to post
Share on other sites
Localhost

Estava a dizer de uma maneira estupida em relação ao meu exemplo, formar 3 quadrados xD


here since 2009

Share this post


Link to post
Share on other sites
mogers

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.

Share this post


Link to post
Share on other sites
Localhost

Ahm, entendi tudo, muito obrigado.

O que eu queria mesmo eram muitos exercícios para poder trabalhar os conceitos! Quanto às olimpiadas já me tinham falado aqui no forúm, acho que foi o Taris ou Tharis    :cheesygrin:


here since 2009

Share this post


Link to post
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
Sign in to follow this  

×

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.