ID do artigo: 104639 - Última revisão: terça-feira, 2 de dezembro de 2003 - Revisão: 2.0

INFO: Alocação de memória dinâmica para matrizes Two-Dimensional

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

A linguagem C não internamente oferece suporte a alocação de memória dinâmica para matrizes bidimensionais. A criação de tal uma estrutura requer alguns programação para defini-la até; no entanto, uma vez criados os elementos pode ser referenciada por notação Colchete duplo familiar ([] []). Não há sobrecarga de memória envolvidos na criação da estrutura. Essa técnica é independente de plataforma trabalhando nos sistemas operacionais MS-DOS, Windows, Windows NT e OS/2.

Mais Informações

Para o compilador gere código para desreferência de elemento de matriz bidimensional, o número de colunas da matriz deve ser conhecido em tempo de compilação. Portanto, é possível alocar dinamicamente uma matriz bidimensional se ponteiro declaração inclui "width" da matriz. Abaixo está um fragmento de código que ilustra isso:
char (*array)[columns];

array = (char (*)[columns]) malloc(sizeof(char) * rows * columns);
if (array == NULL)
{
    printf("Not enough memory!\n");
    return;
}
				
Contudo, para que ambas as dimensões de uma matriz bidimensional em tempo de execução a matriz deve ser alocados dinamicamente. Nesse caso, uma matriz bidimensional alocada dinamicamente deve ser considerada como uma matriz de matrizes unidimensionais. Há alguma memória sobrecarga, no entanto, que requer a alocação de uma matriz de ponteiros de matriz que não é necessária para estaticamente definidos matrizes bidimensionais. Apesar da sobrecarga, cada elemento de dois-matrizes dimensionais podem ser referenciadas com a notação de Colchete apenas como para uma matriz bidimensional estaticamente definida.

Estas são as etapas para alocar dinamicamente a uma matriz bidimensional:
  1. Declare um ponteiro dereferenced duplo de um tipo desejado.
  2. Alocar o número de linhas vezes o tamanho de um ponteiro e atribuir a primeira eliminar referência para o início dessa alocação.
  3. Faça um loop através das linhas e alocar o número de colunas vezes o tamanho do elemento.
A estrutura conceitualmente semelhante à seguinte:
   Array of                    Arrays of
   Pointers                    Elements

   ------     -------------------------                      -------
   |    | -->|   |   |   |   |   |   |     . . . . . . .       |   |
   ------     -------------------------                      -------
   |    | -->|   |   |   |   |   |   |     . . . . . . .       |   |
   ------     -------------------------                      -------
   |    | -->|   |   |   |   |   |   |     . . . . . . .       |   |
   ------     -------------------------                      -------
   |    | -->|   |   |   |   |   |   |     . . . . . . .       |   |
   ------     -------------------------                      -------
         .
         .
         .
         .
         .    -------------------------                      -------
   |    | -->|   |   |   |   |   |   |     . . . . . . .       |   |
   ------     -------------------------                      -------
   |    | -->|   |   |   |   |   |   |     . . . . . . .       |   |
   ------     -------------------------                      -------
				
usar _fmalloc() para MS-DOS e 16 bits do Windows para usar a pilha global até que ponto. Observação para Windows: _fmalloc() está disponível para ser usado quando compilar com Microsoft C/C ++ compilador versões 7.0, 8.0 e c 8.0. Não use GlobalAlloc e GlobalLock porque essa técnica pode consumir muitos seletores para relativamente pequenas alocações.

Ao contrário de uma matriz bidimensional declarada estaticamente, as linhas não são contíguas entre si. Mas como isso é uma matriz de matrizes é possível ter uma estrutura total maior do que 64 K sem usar ponteiros enormes. Se o número de linhas ou o tamanho de linhas for maior que 64 K, enormes ponteiros são necessários.

Código de exemplo

/* Semi-pseudo code for a two-dimensional array of char's
* Note that this sample uses the far heap and uses far pointers.
* For 32-Bit Windows applications on Windows NT or Win32S or for
* OS/2, use malloc() and remove the _far keywords.
*/ 

   char _far * _far * array;
   unsigned int i;
   unsigned int rows, columns;  /* let's keep it within 64k */ 

   /*  Set the rows and columns to desired dimensions. */ 
   rows    = 8;
   columns = 12;

   array = (char _far * _far *) _fmalloc(sizeof(char _far *) * rows);
   if (array == NULL)
   {
       printf("Not enough memory\n");
       return;
   }
   for (i = 0; i < rows; i++)
   {
       array[i] = (char _far *) _fmalloc(sizeof(char) * columns);
       if (array[i] == NULL)
       {
           printf("Not enough memory\n");
           /* handle error, _free() the previously allocated rows */ 
           return;
       }
   }

   /* to use the array: array[row][column] */ 
   array[0][1] = 'x';

   /* etc.   */ 

* To Free the memory used by the array
**
*/ 
   for (i = 0; i< rows; i++)
       _ffree(array[i]);
   _ffree(array);
				

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Palavras-chave: 
kbmt kbinfo kblangc KB104639 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 104639  (http://support.microsoft.com/kb/104639/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.