Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Localhost

Alocação dinamica

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.