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

P_E_D_R_O

malloc

15 mensagens neste tópico

Boas pessoal,

É a primeira vez que escrevo aqui por isso, gostaria de dar os parabéns pela criação deste forum.  :biggrin:

A minha dúvia está relacionada com os ponteiros de ponteiros  :hmm:. Depois de pesquisar na net surgiu-me outra questão. O que faz o int ** no malloc?

Ou seja, se tivessemos só int * significava que queriamos alocar memória para uma variável, etc do tipo inteiro. Agr a minha questão é, o que faz o int ** como está aqui:

p = (int **)malloc(sizeof(int *));

Obg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O malloc retorna sempre um apontador para void. O que o (int **) aí faz é um cast do resultado da chamada ao malloc (que é um void*) para apontador para apontador para int.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

olá

tenho um exemplo de aplicação disso

criar uma matriz quadrada de tamanho n dado pelo utilizador:

  int **reservar(int tam_matriz){
   int **m,i;              /* v = ponteiro para a matriz (de ponteiros para inteiro)*/

   m = calloc (tam_matriz, sizeof(int *));   
                                     /* cria espaco para cada linha da matriz que e' um vector de ponteiros para int */
   for ( i = 0; i < tam_matriz; i++ ) 
         m[i] =  calloc (tam_matriz, sizeof(int));                            /* cada coluna e' um vector de inteiros */
   return (m);                                          /* devolve um ponteiro para matriz[0][0] */ 

espero q possa ajudar com este exemplo.

:biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ajudou qq coisa...  :)

Eu passo a explicar, estou a fazer um programa em linux  :mad: que faça precisamente isso, ou seja,multiplicação de matrizes de dimensão n. A única coisa k não percebi ao olhar para outros códigos, foi a razão de utilizar ponteiros de ponteiros.  :wallbash: Tipo, o pk de utilizar, por exemplo, int **reserva_mem (...)

{

...

}

Não se podia utilizar apenas int reserva_mem (...)

{

...

}

É k se não estou em erro penso k isso iria dar ao mesmo, ou seja, sem ponteiros de ponteiros.

Ou não???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, porque tu não pretendes devolver um int, mas sim um apontador para um apontador de ints (ou seja, para um vector de vectores, uma matriz)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alem de que, se tu alocares memória dentro de uma função, essa alocação só vai existir dentro do contexto da função. Porque ao saires da função toda a memória reservada vai ser limpa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alem de que, se tu alocares memória dentro de uma função, essa alocação só vai existir dentro do contexto da função. Porque ao saires da função toda a memória reservada vai ser limpa.

Só se usares o alloca, caso contrário a memória é alocada na heap e fica disponível até fazeres free da mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, porque tu não pretendes devolver um int, mas sim um apontador para um apontador de ints (ou seja, para um vector de vectores, uma matriz)

Desculpem mas continuo sem perceber....  :wallbash:

Qual é a vantagem de criar uma função que nos devolve um apontador para um apontador? É isto que não estou a perceber. Tipo, quando se cria uma matriz, o pk de se lá colocarem ponteiros para ponteiros que por sua vez apontam para valores e não os valores directamente?  :hmm:

Abç

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é a vantagem de criar uma função que nos devolve um apontador para um apontador? É isto que não estou a perceber. Tipo, quando se cria uma matriz, o porque de se lá colocarem ponteiros para ponteiros que por sua vez apontam para valores e não os valores directamente?  :hmm:

Porque em C tens de passar as estruturas de dados por referência, e não por valor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Repara uma coisa, tu na matriz colocas os inteiros. Contudo, a matriz em si, é só um apontador para um apontador de inteiros.

m = apontador para apontador de int

m[k] = apontador de int

m[k][y] = int

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sendo assim, e aproveitando o código que foi dado em cima

int **reservar(int tam_matriz){
   int **m,i;              /* v = ponteiro para a matriz (de ponteiros para inteiro)*/

   m = calloc (tam_matriz, sizeof(int *));   
                                     /* cria espaco para cada linha da matriz que e' um vector de ponteiros para int */
   for ( i = 0; i < tam_matriz; i++ ) 
         m[i] =  calloc (tam_matriz, sizeof(int));                            /* cada coluna e' um vector de inteiros */
   return (m);

este m=calloc.... significa que está a reservar memória para uma matriz m[ i][j] certo?  ;)

0

Partilhar esta mensagem


Link 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