IvanR 0 Denunciar post Postado Agosto 22, 2008 Dado este código: #include <stdio.h> #include <stdlib.h> float **Alocar_matriz_real (int m, int n) { float **v; /* ponteiro para a matriz */ int i; /* variavel auxiliar */ if (m < 1 || n < 1) { /* verifica parametros recebidos */ printf ("** Erro: Parametro invalido **\n"); return (NULL); } /* aloca as linhas da matriz */ v = (float**) calloc (m,sizeof(float *)); // Um vetor de m ponteiros para float */ if (v == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } /* aloca as colunas da matriz */ for ( i = 0; i < m; i++ ) { v[i] = (float*)calloc (n, sizeof(float)); /* m vetores de n floats */ if (v[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } } return (v); /* retorna o ponteiro para a matriz */ } float **Liberar_matriz_real (int m, int n, float **v) { int i; /* variavel auxiliar */ if (v == NULL) return (NULL); if (m < 1 || n < 1) { /* verifica parametros recebidos */ printf ("** Erro: Parametro invalido **\n"); return (v); } for (i=0; i<m; i++) free (v[i]); /* libera as linhas da matriz */ free (v); /* libera a matriz (vetor de ponteiros) */ return (NULL); /* retorna um ponteiro nulo */ } void main (void) { float **mat; /* matriz a ser alocada */ int l, c; /* numero de linhas e colunas da matriz */ int i, j; /* outros comandos, inclusive inicializacao para l e c */ mat = Alocar_matriz_real (l, c); for (i = 0; i < l; i++) for ( j = 0; j < c; j++) mat[i][j] = i+j; /* outros comandos utilizando mat[][] normalmente */ mat = Liberar_matriz_real (l, c, mat); system("pause"); } Tenho algumas dúvidas: 1) no calloc, se for passado: m = 5; n = 3; para a função, então quer dizer que a matríz será A(5,3) ? Porque se você aloca 5 posições para a linha, quer dizer que o primeiro elemento já está alocado, ou seja, a posição A(1,1) já foi anteriormente alocada pelo primeiro calloc das linhas. Assim como as posições A(2,1), A(3,1), A(4,1) e A(5,1). 2) v não é um vetor, é um ponteiro para ponteiro do tipo float, então como o segundo calloc armazena em v indicando o mesmo como se fosse um vetor? Quer dizer que quando se armazena vários valores ele guarda várias posições na memória de tamanho float, no caso tratado, e podemos tratar isso como sendo um vetor dinâmico? 3) como acessar esta matriz? só fazer mat[0][0] ? Abração Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Agosto 22, 2008 1) Não. Os argumentos do calloc sao qtde de elementos e tamanho em bytes de cada elemento. Se você passar 5 e 3, cada elemento vai ter 3 bytes, mas em memoria continua sendo uma unica linha com 5 elementos. 2) Porque o formato de V é um ponteiro para um array de floats. Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Agosto 22, 2008 Oq você quer dizer é que tenho 5 posições na memória que reservam 3 words (3 bytes mesmo ?) cada uma, oq nos deixaria armazenar 3 estruturas de um determinado tipo? Oq nos levaria ao conceito de matriz. Se armazena 3 bytes, isso quer dizer que armazenaria 3 caracteres (cada caracter 1 byte)? Ou menos que um inteiro (4 bytes) Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Agosto 22, 2008 1 word = 4 bytes. Quantidade de bytes de um tipo não é a mesma coisa que quantidade de estruturas armazenáveis. Se houvesse alguma estrutura que ocupasse 3 bytes, você estaria armazenando 5 estruturas dessas.Mesmo usando char: calloc(5,3) abre espaco p/ 15 chars, mas fazendo V = 'c', você está acessando uma posição na memória que contém 3 bytes p/ armazenar um tipo que ocupa 1 byte. Pode até tentar usar operaçoes bit a bit p/ enfiar mais de um char no mesmo indice da memoria,mas é um trabalho desgracado e desnecessario quando se tem malloc(n*sizeof(char)); Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Agosto 25, 2008 Entendi então o que tem por trás do malloc(n*sizeof(char)) ou o calloc, mas acabei tendo algumas outras dúvidas: Oq acontece com os "2 bytes ociosos" no exemplo que você deu? E se for alocar uma estrutura maior que a que desejo Teria de reestruturar td ? Claro, sem usar o malloc, que por ele posso fazer isso facilmente, mas pergunto mais a título de curiosidade agora Obrigado pelas respostas Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Agosto 25, 2008 Oq acontece com os "2 bytes ociosos" no exemplo que você deu? Na teoria esse espaço fica reservado para os outros elementos da estrutura. E se for alocar uma estrutura maior que a que desejo Teria de reestruturar td ? Claro, sem usar o malloc, que por ele posso fazer isso facilmente, mas pergunto mais a título de curiosidade agora Voce teria espaço desnecessário reservado. O correto é alocar exatamente o que pretende usar. Compartilhar este post Link para o post Compartilhar em outros sites