Jump to content
skinie18

malloc basico

Recommended Posts

skinie18

Ola, nao estive muito atento nas aulas de .c e encontro-me com uma duvida para realizar um trabalho.

Usando o malloc e sem usar listas ligadas como posso tornar o array[20][30]; em por exemplo array[infinito][infinito]; ???

main () {
int array[20][30];
int counter = 0;

while(0 == 0){
scanf("%d", &array[1][counter]);
counter++;
}
}

Share this post


Link to post
Share on other sites
rolando2424

Não estou a perceber muito bem a tua dúvida, mas se depois de fazeres algo do género:

int *array = malloc(20*30*sizeof(int)) // Espaco para guardar 20 arrays de 30 inteiros cada

E depois descobrires que precisas de modificar o tamanho do apontador array podes utilizar a instrução realloc

No entanto, se percebi bem o que precisas, utilizar o realloc pode dar problemas porque inicialmente o array na memoria e algo assim:

  |  .........    |

  +---------------+

  | array[0][0]  |

  +---------------+

  | array[0][1]  |

  +---------------+

  | array[0][2]  |

  +---------------+

  |      .        |

  |      .        |

  |      .        |

  +---------------+

  | array[0][29]  |

  +---------------+

  | array[1][0]  |

  +---------------+

  | array[1][1]  |

  +---------------+

  | array[1][2]  |

  +---------------+

  |      .        |

  |      .        |

  |      .        |

  +---------------+

  | array[19][29] |

  +---------------+

  |  .........    |

E se tentares fazer o realloc para ficar por exemplo um array de [20][40] a memória irá ficar assim:

  |  .........    |

  +---------------+

  | array[0][0]  |

  +---------------+

  | array[0][1]  |

  +---------------+

  | array[0][2]  |

  +---------------+

  |      .        |

  |      .        |

  |      .        |

  +---------------+

  | array[0][29]  |

  +---------------+  /

  | array[0][30]  |  X------------ ficou com o valor que dantes estava em array[1][0]

  +---------------+  \

  | array[0][31]  |

  +---------------+

  |      .        |

  |      .        |

  |      .        |

  +---------------+  /

  | array[1][0]  |  X------------ ficou com o valor que dantes estava em array[1][10]

  +---------------+  \

  |      .        |

  |      .        |

  |      .        |

  +---------------+

  |              |

Portanto se começares a usar as novas posições de memória como [0 ][30], começas a escrever por cima dos valores que já lá estavam (pelo menos segundo o meu escasso conhecimento do funcionamento do realloc.

Portanto dependendo daquilo que estás a tentar fazer, terás de copiar o conteúdo dos arrays para uma nova posição de memória.

Em pseudo código ficaria algo do género:

int numero_arrays = 20;
int comprimento_arrays = 30;

int *array = malloc(numero_arrays*comprimento_arrays*sizeof(int));

<Inserir valores dentro do array>

if (<array cheio>) {
    // Aumentar em 10 o comprimento dos arrays 
    int novo_comprimento_arrays = comprimento_arrays + 10;
    int *novo_array = malloc(numero_array * novo_comprimento_arrays * sizeof(int));

    // Copiar tudo para os sitios certos
    for (int k = 0; k != numero_arrays; k++)
        for (int i = 0; i != comprimento_arrays; i++)
            novo_array[k][i] = array[k][i];

    // Quando chegar aqui os valores de array ja estao nas posicoes certas de novo_array
    // e cada array em novo_array tem um comprimento de 20+10 = 30 inteiros
    // Por isso apaga-se o array antigo e coloca-se o apontador array a apontar para o novo array
    free(array);

    array = novo_array;
}

Podes de forma semelhante aumentar o número de arrays, isto é, em vez do apontador array ser [20][30], pode passar a ser [30][30].


Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos. Prontos, a minha pessoa está oficialmente protegida legalmente :D

Share this post


Link to post
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.