Jump to content

malloc


P_E_D_R_O

Recommended Posts

Boas pessoal,

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

A minha dúvia está relacionada com os ponteiros de ponteiros  ?. 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.

Link to comment
Share on other 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.

😁

Link to comment
Share on other sites

Ajudou qq coisa...  🙂

Eu passo a explicar, estou a fazer um programa em linux  ? 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???

Link to comment
Share on other 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.

Link to comment
Share on other 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?  ?

Abç

Link to comment
Share on other 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?  ?

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

<3 life

Link to comment
Share on other 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?  😉

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
×
×
  • 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.