Funkcja Malloc - C

0

Mam taki program:

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

int main ()
{
  int i,n;
  char * buffer;

  printf ("Podaj dlugosc ciagu znakow: ");
  scanf ("%d", &i);

  buffer = (char*) malloc (i+1);
  if (buffer==NULL) exit (1);

  for (n=0; n<i; n++)
    buffer[n]=rand()%26+'a';
  buffer[i]='\0';

  printf ("Losowy ciag znakow: %s\n",buffer);
  free (buffer);

  return 0;
}

Zastanawia mnie dlaczego funkcja malloc ma rezerwować pamięć dla "i+1" elementów? Czy to jest tak, że musi mieć jeszcze zapas na ten "buffer[i]='\0' " czyli znak końca tekstu?

0

Tak

0

Nie będę zakładał kolejnego tematu, więc tutaj zamieszczę pytanie tego samego pokroju. Więc mam do napisania takie coś:

 
/*Napisać program realizujący następujące czynności:

przydzielenie początkowego bloku pamięci dla 4 liczb rzeczywistych (float);
wczytanie 12 liczb rzeczywistych do przydzielonego bloku pamięci zwiększając jego rozmiar po wczytaniu 4 kolejnych liczb;
wypisanie wprowadzonych liczb w odwrotnej kolejności;
zwolnienie przydzielonego bloku pamięci. */

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

int main()
{
    float *ptr, numb;
    int si = 4,n,count=0;

    ptr = (float*) malloc (si*sizeof(float));
    if (!ptr)
    {
        printf("Blad alokacji pamieci!");
    }

    do {
        printf("\nWprowadz liczbe rzeczywista nr %d (0, by zakonczyc): ",count);
        scanf("%f", &numb);
        count++;
            if ((count+1)%4==0)
            {
                ptr = (float*) realloc (ptr, 2 * sizeof(float));
            }
            if (ptr==NULL)
            {
                printf("\nBlad alokacji pamieci!");
            }
        ptr[count-1]=numb;

    } while (count!=12 && numb != 0);

    for (n=count-1;n>=0;n--)
    {
        printf("\nLiczba nr %d to %.2f.",n+1,ptr[n]);
    }

    free (ptr);
    return 0;
}


Piszę w Code::Blocks, no i wszystko byłoby ładnie, gdyby nie wywalało mi błędu przy wprowadzeniu 12 liczb. Błąd mówi o tym, że program przestał działać. Domyślam się, że gdzieś jest przekraczany rozmiar możliwej pamięci.

1

Użyj debuggera.

0

Przy użyciu debuggera, podczas wprowadzania 7 elementu program się zatrzymał i wyskoczył komunikat "no symbol "l" in current value". Od razu uprzedzam, że znam angielski, ale nic ten komunikat mi nie mówi.

0

Ok, już na razie ten wątek zakończyłem. W końcu rozwiązałem problem.

0

Mam kolejne pytanie do programu z funkcją calloc. Jest to jakiś głupi, denerwujący błąd, dlatego też nie chcę zakładać nowego tematu.

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

int main()
{
    int i,n=0,tab[3]={0};
    float *arr,max=0,min;

    printf("\nIlosc liczb do zapamietania: ");
    scanf("%d",&i);

    arr = (float*) calloc (i,sizeof(float));
    if (!arr)
    {
        printf("Blad alokacji pamieci!");
    }

    do {
        printf("\nLiczba nr %d: ",n+1);
        scanf("%f", &arr[n]);
        n++;
    } while (n<i);

    min = arr[0];

    for (n=0;n<i;n++)
    {
        if (max<arr[n])
        {
            max = arr[n];
            tab[0] = n+1;
        }

        if (min>arr[n])
        {
            min = arr[n];
            tab[1] = n+1;
        }
    }

    printf("\nMax to: %.2f (wprowadzona jako %d liczba).",max,tab[0]);
    printf("\nMin to: %.2f (wprowadzona jako %d liczba).",min,tab[1]);
    free(arr);
    getchar();
    return EXIT_SUCCESS;
}

Błąd polega na tym, że gdy wpisuje minimalną wartość jako pierwszą, to na końcu wyświetla mi złą pozycję tej liczby. Tzn. powinno być "(wprowadzona jako liczba 1)".

0
mic4ael napisał(a)

Błąd polega na tym, że gdy wpisuje minimalną wartość jako pierwszą, to na końcu wyświetla mi złą pozycję tej liczby. Tzn. powinno być "(wprowadzona jako liczba 1)".

no to chyba logiczne, skoro ustawiasz min na arr[0] a nie przypisujesz przy tym wartości tab[1] na 1
masz 3 wyjścia:
a) ustaw tab[1]
b) zrób tak jak z max i do min ustaw początkowo MAXINT a nie arr[0]
c) zamień warunki z > na >=

0

Ehh, aż mi głupio teraz. Skoro ustawiłem wartość minimalną na pierwszy element, to jej współrzędną też trzeba było zmodyfikować.. Dzięki wielkie.

0

Już ostatnie pytanie z serii alokacji pamięci. Mianowicie, mam program do napisania, aby znajdywał minimum i maximum z podanych liczb oraz wyświetlał ich pozycje. Tylko, że znów coś z tymi pozycjami jest nie tak.

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

int main()
{
    int i,n=0,tab[2]={0},ile1=0,ile2=0;
    float *arr,max=0,min;
    int *data1,*data2;

    data1 = (int*) malloc (1);
    data2 = (int*) malloc (1);

    printf("\nIlosc liczb do zapamietania: ");
    scanf("%d",&i);

    arr = (float*) calloc (i,sizeof(float));
    if (!arr)
    {
        printf("Blad alokacji pamieci!");
    }

    do {
        printf("\nLiczba nr %d: ",n+1);
        scanf("%f", &arr[n]);
        n++;
    } while (n<i);

    min = arr[0];

    for (n=0;n<i;n++)
    {
        if (max<arr[n])
        {
            max = arr[n];
            tab[0] = n+1;
        }

        if (min>=arr[n])
        {
            min = arr[n];
            tab[1] = n+1;
        }
    }

    /*printf("\nMax to: %.2f (wprowadzona jako %d liczba).",max,tab[0]);
    printf("\nMin to: %.2f (wprowadzona jako %d liczba).",min,tab[1]);*/


    data1[0]=tab[1];
    data2[0]=tab[0];

    for (n=0;n<i;n++)
    {
        if (arr[n]==min)
        {
            ile1++;
            data1 = (int*) calloc (ile1+1,sizeof(int));
            data1[ile1-1]=n;
        } else if (arr[n]==max){
            ile2++;
            data2 = (int*) calloc (ile2+1,sizeof(int));
            data2[ile2-1]=n;
        }
    }

    for (n=0;n<ile1;n++)
    {
        printf("\n\nWartosc minimalna to %.2f i wystapila jako %d liczba.",min, data1[n]+1);
    }

    for (n=0;n<ile2;n++)
    {
        printf("\n\nWartosc maksymalna to %.2f i wystapila  jako %d liczba.",max,data2[n]+1);
    }

    printf("\n\n");
    free(arr);
    getchar();
    return EXIT_SUCCESS;
}

0

Już sobie poradziłem z tym problemem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1