malloc

Sekcia: Programovanie 26.11.2007 | 15:54
Avatar Ondrej Danko Debian | Fedora  Používateľ
Ahojte, potrebujem poradit s takouto fciou:
void nacitaj(float *znamky, char meno[], int *pocet, float *sucet) {
znamky = (float *) malloc(POCET * sizeof(float));

float pom;
int i = 0;
*sucet = 0;

printf("\n%s\n", meno);
printf("Zadajte, prosim vase znamky:\n");
while (scanf("%f", &pom) == 1) {
if (pom >= 1 && pom <= 5) {
*sucet += pom;
znamky[i++] = pom;
} else {
printf("Cislo %3.2f neni znamka!\n", pom);
}
}

*pocet = i;
return;
}

vsetko funguje spravne, len alokovane pametove miesta fciou malloc po skonceni fcie nacitaj sa stratia (prestanu platit)...
cize 2.fcia vypis potom nefunguje spravne.
    • Re: malloc 26.11.2007 | 16:50
      Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
      Problem je v tom, ze navratova hodnota funkcie malloc sa ulozi do pointera, ktory ukazuje na adresu ma ktorej sa nachadza parameter funckie a nie do pointer, ktory je ako parameter


      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      char *hello;

      void pokus(char **x, int n)
      {
      *x = malloc(n);

      strcpy(*x, "hello");

      printf("&x = %10p -- adresa pointera my (v stackframe funckie pokus)\n", &x);
      printf("x = %10p -- adresa na ktoru ukazuje pointer x\n", x);
      printf("*x = %10s -- hodnota, ktora sa nachada na adrese na ktoru ukazuje pointer x\n", *x);

      printf("&hello = %10p\n", &hello);
      printf("hello = %10p\n", hello);
      }

      int main()
      {

      pokus(&hello, 10);
      printf("platne hello = %s\n", hello);
      free(hello);

      return 0;
      }
      • Re: malloc 26.11.2007 | 21:17
        Avatar Ondrej Danko Debian | Fedora  Používateľ
        dik...ale co mam robit ked mam pole?
        lebo potom sa to sprava ako viacrozmerne....

        #include <stdio.h>
        #include <stdlib.h>

        #define POCET 10

        void pokus(int **pole);

        int main() {

        int *pole,i;
        pokus(&pole);
        for (i = 0; i < POCET; i++)
        printf("pole[%d] == %d\n", pole[i], pole[i]);
        free(pole);

        return 0;
        }

        void pokus(int **pole) {
        int i;
        *pole = malloc(1); // 1 riadok [viacrozmerne pole]
        // stlpce ???
        for (i = 0; i < POCET; i++)
        *pole[i] = i;
        }
        • Re: malloc 26.11.2007 | 22:33
          Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
          /*
          * oprava :
          */

          #include <stdio.h>
          #include <stdlib.h>

          #define POCET 10

          void pokus(int **pole);

          int main() {

          int *pole,i;
          pokus(&pole);
          for (i = 0; i < POCET; i++)
          printf("pole[%d] == %d\n", pole[i], pole[i]);
          free(pole);

          return 0;
          }

          void pokus(int **pole) {
          int i;
          *pole = malloc(POCET * sizeof(int)); // 1 riadok [viacrozmerne pole]
          // stlpce ???
          for (i = 0; i < POCET; i++)
          (*pole)[i] = i;
          }
          • Re: malloc 26.11.2007 | 23:16
            Avatar Ondrej Danko Debian | Fedora  Používateľ
            dik....toto som potreboval ;)

            a pritom aka mala chyba (obycajne zatvorky :D )

            PS:ten riadok s malloc som mal dobre...len som sa potom uz zacal domnievat ze to je dvojrozmerne pole :D