• Alocação de Arrays

    • Para armazenar um array o compilador C calcula o tamanho, em bytes, necessário e reserva posições sequenciais na memória;
      • Note que isso é muito parecido com alocação dinâmica;
    • Existe uma ligação muito forte entre ponteiros e arrays.
      • O nome do array é apenas um ponteiro que aponta para o primeiro elemento do array;
    • Ao alocarmos memória estamos, na verdade, alocando um array;
    • Para alocarmos arrays com mais de uma dimensão, utilizamos o conceito de “ponteiro para ponteiro”;
      • Ex.: char ***p3;
    • Para cada nível do ponteiro, fazemos a alocação de uma dimensão do array;
    char letra = 'a';
    char *p1;
    char **p2;
    char ***p3;
    
    p1 = &letra;
    p2 = &p1;
    p3 = &p2;
    

    Untitled

    int **p;
    int i , j , N = 2;
    
    p = (int **) malloc( N * sizeof( int* ) );
    
    for ( i = 0 ; i < N ; i++ ) {
    	p[i] = ( int* ) malloc( N * sizeof( int ) );
    	for ( j = 0 ; j < N ; j++ ) {
    		scanf( "%i" , &p[i][j] );
    	}
    }
    

    Untitled

    • Em um ponteiro para ponteiro, cada nível do ponteiro permite criar uma nova dimensão no array.

      Untitled

    • Diferente dos arrays de uma dimensão, para liberar um array com mais de uma dimensão da memória, é preciso liberar a memória alocada em cada uma de suas dimensões, na ordem inversa da que foi alocada

    int **p;
    int i , j , N = 2;
    
    p = (int **) malloc( N * sizeof( int* ) );
    
    for ( i = 0 ; i < N ; i++ ) {
    	p[i] = ( int* ) malloc( N * sizeof( int ) );
    	for ( j = 0 ; j < N ; j++ ) {
    		scanf( "%i" , &p[i][j] );
    	}
    }
    
    for ( i = 0 ; i < N ; i++ ) {
    	free( p[i] );
    }
    free(p);
    
  • Alocação de Struct

    • Assim como os tipos básicos, também é possível fazer a alocação dinâmica de estruturas;
    • As regras são exatamente as mesmas para a alocação de uma struct;
  • Exemplo