Zwalnianie pamieci.

0

Witam.

Mam problem dotyczacy zwalniania pamieci przydzielanej przez malloc. Free w moim programie nie zwalnia pamieci (przynajmniej tak mi sie wydaje), bo po ponownym przydzieleniu pamieci tablica jest 'wypelniona' tym co zawierala wczesniej. Nie wiem czy kod jest zly czy tak ma byc. Bardzo prosze o rade. Dziekuje. Oto kod:

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

int main()
{
int hm,k,ile,w;
char znak[1];
char *liczba;
scanf("%d\n",&hm);

for(k=0;k<hm;k++)
  
{
  scanf("%d",&ile);
  liczba=malloc(110*sizeof(char));
    liczba[0]='1';
    scanf("%c",&znak[0]);
  for(w=0;w<ile;w++)
  {
    scanf("%c",&znak[0]);
    
    if((znak[0]=='?')&&(w==0))
        {
          liczba[0]='9';
        }
            else
        {
            if(znak[0]=='?')
         { 
           znak[0]='0';
           strcat(liczba,znak);
         }
    }
  }
  
   printf("%s\n",liczba);
   free(liczba);
}
return 0;
} 
0

Jeżeli chcesz posługiwać się napisem printf("%s",...), strcat(...) to musisz mieć napis, czyli tablica znaków musi mieć znak zakończenia '\0'

0

Jak sie to ma do zwalniania pamieci, (bo jestem niekumaty) ?

0

bo po ponownym przydzieleniu pamieci tablica jest 'wypelniona' tym co zawierala wczesniej.

Bo jej nie czyścisz + najwyraźniej przydzielany jest ten sam blok pamięci.

Jak sie to ma do zwalniania pamieci, (bo jestem niekumaty) ?

Nijak, ale w tym miejscu:
printf("%s\n",liczba);
Możesz sobie zepsuć cały program (w sensie: wycrashuje się z naruszeniem ochrony pamięci), jeżeli gdzieś w obszarze wskazywanym przez wskaźnik liczba akurat nie trafi się znak \0 (null-terminator) i kod zacznie czytać dane spoza zaalokowanego zakresu.
Innymi słowy: w C literały znakowe muszą być zakończone znakiem \0 (nie cyfrą 0, a znakiem \0!), jeżeli chcesz je np.wyświetlić.
Przykład:

char* text = malloc(51);
text[50] = 0;
// jakieś operacje na "text", które nie ruszają ostatniego bajtu (tego "text[50]")
printf("%s", text);

Ew.:

char* text = malloc(50);
memset(text, 0, 50); // <- to jest lepsze od rozwiązania powyżej, chociaż warunek pozostaje (nietykanie ostatniego bajtu)
// jakieś operacje
printf("%s", text);
0

Dziekuje za informacje. :)

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