Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

IvanR

quanto a alocação dinâmica

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.