File: Stare vježbe/vjezbe10/63b__malloc_2Dpolja.c

  1. /*
  2.   63b__malloc_2Dpolja.c
  3.   Rad s dinamicki alociranim dvodimenzionalnim poljima -- 2. metoda
  4.   -----
  5.   Ovaj pristup za rad s dinamicki alociranim dvodimenionalnim poljima
  6.   koristi se u slucaju kada prilikom compiliranja nije poznata
  7.   velicina retka (odnosno maksimalni broj stupaca).
  8.   U tu svrhu alocirat ce se prvo polje pointera na zeljeni tip, te
  9.   potom alocirati memorija za svaki od tih pointera posebno. Ideja je da
  10.   svaki pointer iz alociranog polja pointera pokazuje na pojedini redak
  11.   polja.
  12. */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <malloc.h>
  17.  
  18. void check(void* p) {
  19. if(p == NULL) {
  20. printf("Greska u alokaciji memorije!\n");
  21. exit(1);
  22. }
  23. }
  24.  
  25. void unos(float** A, int m, int n) {
  26. int i, j;
  27. for(i=0; i<m; i++)
  28. for(j=0; j<n; j++) {
  29. printf("A[%d][%d]=", i, j);
  30. scanf("%f", &A[i][j]);
  31. }
  32. }
  33.  
  34. void ispis(float** A, int m, int n) {
  35. int i, j;
  36. for(i=0; i<m; i++) {
  37. for(j=0; j<n; j++)
  38. printf("%.2f ", A[i][j]);
  39. printf("\n");
  40. }
  41. }
  42.  
  43. int main() {
  44. int m, n, i;
  45. /* Deklariramo dvodimenzionalno polje kao pokazivac na pokazivac na
  46.   float. */
  47. float** A;
  48.  
  49. printf("Unesite broj redaka matrice A: ");
  50. scanf("%d", &m);
  51. printf("Unesite broj stupaca matrice A: ");
  52. scanf("%d", &n);
  53.  
  54. /* Prvo alociramo memoriju za buduce pointera na retke */
  55. A = (float**) malloc(m*sizeof(float*));
  56. check(A);
  57. /* Potom alociramo memoriju za svaki redak posebno */
  58. for (i=0; i<m; i++) {
  59. A[i]= (float*) malloc(n*sizeof(float));
  60. check(A[i]);
  61. }
  62.  
  63. for(i=0; i<m; i++)
  64. printf("Adresa %d. retka: %d\n", i, A[i]);
  65.  
  66. printf("\n");
  67. unos(A, m, n);
  68. printf("\n");
  69. ispis(A, m, n);
  70.  
  71. /* Oslobadjanje alocirane memorije:
  72.   prvo oslobadjamo memoriju alociranu za svaki redak posebno, te na kraju
  73.   memoriju alociranu za polje pointera */
  74. for (i=0; i<m; i++)
  75. free(A[i]);
  76. free(A);
  77.  
  78. return 0;
  79. }
  80.