Błąd przy zwalnianiu pamięci - ConsoleApplication1.exe triggered a breakpoint

0

Witam,
Mam problem z moim programem.

Otóż program ma obsługiwać parametry z konsoli i przetwarzać plik wejściowy (o ścieżce podanej przy parametrze -PIN i nazwie w param -FIN na wyjściowy (-POUT sciezkawyjsciowa -nieobowiazkowe i -FOUT nazwawyjsciowa) wg określonych założeń.
Ogólnie wszystko mi działa, ale jak chcę zwolnić pamięć, to wywala błąd "ConsoleApplication1.exe triggered a breakpoint". Męczę się z tym już trochę i nie mogę dojść do tego, w czym jest błąd. Może gdzieś w mallocach? Każde wywołanie free(i tu jedna z moich zmiennych) kończy się tym błędem. Co może być nie tak?

Oto kod: http://pastebin.com/3fsYwDDt

Z góry dzięki za pomoc.
Pozdrawiam

1

Alokujesz pamięć ale potem podpisujesz do tych swoich wskaźników adresy z argv. Tak się nie kopiuje tablic. Musisz użyć strcpy jakiegoś. W efekcie teraz robisz free na elementach argv i stąd problem.

1

Żadnych przydzieleń pamięci, żadnych składanek, użytkownik potrafi podać plik razem ze ścieżką, przy okazji dodatkowa funkcjonalność :

int main(int argc, char *argv[])
  {
   FILE *myin=stdin,*myout=stdout;
   for(i=1;i<argc;++i)
     {
       if(!strcmp(argv[i],"-IN"))
         {
          if(!(myin=fopen(argv[++i],"r")))
            {
             fprintf(stderr,"Blad otwarcia pliku wejsciowego %s!\n",argv[i]);
             return 1;
            }
         }
       else if(!strcmp(argv[i],"-OUT"))
         {
          if(!(myout=fopen(argv[++i],"w")))
            {
             fprintf(stderr,"Blad otwarcia pliku wyjsciowego %s!\n",argv[i]);
             return 1;
            }
         }
     }
   ...
   if(myin!=stdin) fclose(myin);
   if(myout!=stdout) fclose(myout);
   return 0;
  }
0

@Shalom, dziękuję Ci bardzo za Twój post. Nie pomyślałem o tym i stąd ten błąd. Teraz wywala mi już tylko na zwalnianiu sciezkawej i sciezkawyj - czy dobrze rozumiem, że chodzi o to, że przy łączeniu stringów tablica charów wychodzi poza zaolokowane miejsce, bo nie realokowałem go?
Próbowałem zrobić coś takiego:

	strcat(sciezkawej, "/"); //dodaj ukosnik w razie czego
	tmp = realloc(sciezkawej, (strlen(nazwawej)) * sizeof(char));
	sciezkawej = tmp;
	strcat(sciezkawej, nazwawej); //polacz dwa stringi
	tmp = NULL;

Ale niestety dodaje mi zawartość nazwawej poza zaolokowany obszar pamięci. Hmm, czy można prosić o jakąś wskazówkę? ;-)

Dziękuję bardzo za odpowiedzi. @_13th_Dragon, dzięki za minimalizację kodu i w ogóle, ale niestety tak ma być jak jest - jest to ćwiczenie z programowania, które mam do napisania i ścieżka musi być podawana osobno. Wiem, dziwne, bez sensu (tzn. no, ma to jakiś sens, pewnie chodzi o to, by się nauczyć funkcji z biblioteki string.h) - ale tak ma być i już.

PS A, aktualnie w pętli for jeden z ifów wygląda tak:

	if (strcmp(argv[i], "-FIN") == 0) {
			nazwawej = malloc((strlen(argv[i + 1]) + 1) * sizeof(char)); //alokowanie pamieci
			strcpy(nazwawej, argv[i + 1]); //wczytanie nastepnego argumentu do zmiennej
			//printf("nazwej %s\n", nazwawej); //test
		}

Okazuje się, że to jednak zwalnianie nazwawej i nazwawyj tworzy błędy z tego co widzę w debuggerze...

1
sciezkawej=malloc(strlen(argv[i+1])+1); // plus znak końca
strcpy(sciezkawej,argv[i+1]);
...
sciezkawej=realloc(sciezkawej,strlen(sciezkawej)+strlen(nazwawej)+2); // oba napisy plus znak końca plus lamana
strcat(strcat(sciezkawej,"/"),nazwawej);
0

Dziękuję bardzo za pomoc! Wszystko działa. Jesteście rewelacyjni.

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