• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Prośba o sprawdzenie, czy nie ma wycieków pamięci w programie

0 głosów
92 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Deloryn Bywalec (2,060 p.)

Jeśli ktoś ma czas i chęci, proszę o sprawdzenie mojego kodu. To jest rozwiązanie jednego z problemów Project Euler w czystym C. Kilka razy wywołałem tu malloc. Nie jestem pewny, czy wszystko jest w porządku.

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

char* addTwoCharDigits(char digitOne, char digitTwo) {
  int sum = (digitOne-'0') + (digitTwo-'0');
  char *strSum = malloc(2);
  strSum[0] = (sum/10) + '0';
  strSum[1] = (sum%10) + '0';
  return strSum;
}

char* addTwoChars(char numberOne[53], char numberTwo[53]) {
  char* newNumber = malloc(53);
  char* twoDigitsSum;
  char tempDigit;
  for(int i=52; i>=0; i--) {
    twoDigitsSum = addTwoCharDigits(numberOne[i], numberTwo[i]);
    newNumber[i] = twoDigitsSum[1];
    tempDigit = twoDigitsSum[0];
    free(twoDigitsSum);
    if(tempDigit!='0') {
      for(int j=i-1; j>=0; j--) {
        twoDigitsSum = addTwoCharDigits(numberOne[j], tempDigit);
        numberOne[j] = twoDigitsSum[1];
        tempDigit = twoDigitsSum[0];
        free(twoDigitsSum);
        if(tempDigit=='0') break;
      }
    }
  }
  return newNumber;
}

void printResult(char *sumOfNumbers) {
  printf("Result (first 10 digits): ");
  bool isDigitStart = false;
  int counter = 0;
  for(int i=0; i<53; i++) {
    if(sumOfNumbers[i]!='0') isDigitStart = true;
    if(isDigitStart) {
      printf("%c", sumOfNumbers[i]);
      counter += 1;
    }
    if(counter == 10) break;
  }
  printf("\n");
}

void main() {
  char numbers[100][53];
  char number[53];
  char input[5000]="37107287533902102798797998220837590246510135740250463769376774900097126481248969700780504170182605387432498619952474105947423330951305812372661730962991942213363574161572522430563301811072406154908250230675882075393461711719803104210475137780632466768926167069662363382013637841838368417873436172675728112879812849979408065481931592621691275889832738442742289174325203219235894228767964876702721893184745144573600130643909116721685684458871160315327670386486105843025439939619828917593665686757934951621764571418565606295021572231965867550793241933316490635246274190492910143244581382266334794475817892575867718337217661963751590579239728245598838407582035653253593990084026335689488301894586282278288018119938482628201427819413994056758715117009439035398664372827112653829987240784473053190104293586865155060062958648615320752733719591914205172558297169388870771546649911559348760353292171497005693854370070576826684624621495650076471787294438377604532826541087568284431911906346940378552177792951453612327252500029607107508256381565671088525835072145876576172410976447339110607218265236877223636045174237069058518606604482076212098132878607339694128114266041808683061932846081119106155694051268969251934325451728388641918047049293215058642563049483624672216484350762017279180399446930047329563406911573244438690812579451408905770622942919710792820955037687525678773091862540744969844508330393682126183363848253301546861961243487676812975343759465158038628759287849020152168555482871720121925776695478182833757993103614740356856449095527097864797581167263201004368978425535399209318374414978068609844840309812907779179908821879532736447567559084803087086987551392711854517078544161852424320693150332599594068957565367821070749269665376763262354472106979395067965269474259770973916669376304263398708541052684708299085211399427365734116182760315001271653786073615010808570091499395125570281987460043753582903531743471732693212357815498262974255273730794953759765105305946966067683156574377167401875275889028025717332296191766687138199318110487701902712526768027607800301367868099252546340106163286652636270218540497705585629946580636237993140746255962240744869082311749777923654662572469233228109171419143028819710328859780666976089293863828502533340334413065578016127815921815005561868836468420090470230530811728164304876237919698424872550366387845831148769693215490281042402013833512446218144177347063783299490636259666498587618221225225512486764533677201869716985443124195724099139590089523100588229554825530026352078153229679624948164195386821877476085327132285723110424803456124867697064507995236377742425354112916842768655389262050249103265729672370191327572567528565324825826546309220705859652229798860272258331913126375147341994889534765745501184957014548792889848568277260777137214037988797153829820378303147352772158034814451349137322665138134829543829199918180278916522431027392251122869539409579530664052326325380441000596549391598795936352974615218550237130764225512118369380358038858490341698116222072977186158236678424689157993532961922624679571944012690438771072750481023908955235974572318970677254791506150550495392297953090112996751986188088225875314529584099251203829009407770775672113067397083047244838165338735023408456470580773088295917476714036319800818712901187549131054712658197623331044818386269515456334926366572897563400500428462801835170705278318394258821455212272512503275512160354698120058176216521282765275169129689778932238195734329339946437501907836945765883352399886755061649651847751807381688378610915273579297013376217784275219262340194239963916804498399317331273132924185707147349566916674687634660915035914677504995186714302352196288948901024233251169136196266227326746080059154747183079839286853520694694454072476841822524674417161514036427982273348055556214818971426179103425986472045168939894221798260880768528778364618279934631376775430780936333301898264209010848802521674670883215120185883543223812876952786713296124747824645386369930090493103636197638780396218407357239979422340623539380833965132740801111666627891981488087797941876876144230030984490851411606618262936828367647447792391803351109890697907148578694408955299065364044742557608365997664579509666024396409905389607120198219976047599490197230297649139826800329731560371200413779037855660850892521673093931987275027546890690370753941304265231501194809377245048795150954100921645863754710598436791786391670211874924319957006419179697775990283006991536871371193661495281130587638027841075444973307840789923115535562561142322423255033685442488917353448899115014406480203690680639606723221932041495354150312888033953605329934036800697771065056663195481234880673210146739058568557934581403627822703280826165707739483275922328459417065250945123252306082291880205877731971983945018088807242966198081119777158542502016545090413245809786882778948721859617721078384350691861554356628840622574736922845095162084960398013400172393067166682355524525280460972253503534226472524250874054075591789781264330331690";

  for(int i=0; i<100; i++) {
    number[0] = '0';
    number[1] = '0';
    number[2] = '0';
    for(int j=3; j<53; j++) {
      number[j] = input[50*i+j-3];
    }

    for(int k=0; k<53; k++) {
      numbers[i][k] = number[k];
    }
  }

  char *sumOfNumbers = malloc(53);
  for(int i=0; i<53; i++) {
    sumOfNumbers[i] = '0';
  }

  char *sumOfTwoNumbers;
  for(int i=0; i<100; i++) {
    sumOfTwoNumbers = addTwoChars(sumOfNumbers, numbers[i]);
    for(int k=0; k<53; k++) {
      sumOfNumbers[k] = sumOfTwoNumbers[k];
    }
    free(sumOfTwoNumbers);
  }

  printResult(sumOfNumbers);
  free(sumOfNumbers);
}

 

komentarz 9 października 2018 przez j23 Szeryf (97,580 p.)
Pozbądź się tych alokacji pamięci. Według mnie są tutaj kompletnie zbędne.
komentarz 9 października 2018 przez Deloryn Bywalec (2,060 p.)
W takim razie - według Ciebie - jakie powinno być idealne rozwiązanie?
komentarz 9 października 2018 przez j23 Szeryf (97,580 p.)

Na szybko:

char* addTwoCharDigits(char strSum[2], char digitOne, char digitTwo) {
	int sum = (digitOne-'0') + (digitTwo-'0');
	strSum[0] = (sum/10) + '0';
	strSum[1] = (sum%10) + '0';
	return strSum;
}
 
char* addTwoChars(char newNumber[53] , char numberOne[53], char numberTwo[53]) {
  char tempDigit;
  char strSum[2];

  for(int i=52; i>=0; i--) {
	addTwoCharDigits(strSum, numberOne[i], numberTwo[i]);
	newNumber[i] = strSum[1];
	tempDigit = strSum[0];

	if(tempDigit!='0') {
	  for(int j=i-1; j>=0; j--) {
		addTwoCharDigits(strSum, numberOne[j], tempDigit);
		numberOne[j] = strSum[1];
		tempDigit = strSum[0];
		if(tempDigit=='0') break;
	  }
	}
  }

 

komentarz 9 października 2018 przez Deloryn Bywalec (2,060 p.)
Rozumiem. Dziękuję za pomoc

2 odpowiedzi

0 głosów
odpowiedź 9 października 2018 przez Deloryn Bywalec (2,060 p.)
Odświeżam
0 głosów
odpowiedź 9 października 2018 przez mokrowski VIP (101,860 p.)
A nie umiesz sam sprawdzić? Kompilatory gcc i clang mają obecnie od tego odpowiednie narzędzia a i valgrind'a warto się nauczyć.

PS. Gratuluję pomysłu na ciąg znaków...
komentarz 9 października 2018 przez Deloryn Bywalec (2,060 p.)
Nie umiem - to jest moja poboczna zabawa, bo pracuję w zupełnie innej technologii. Ale dziękuję za informacje.

Podobne pytania

+1 głos
2 odpowiedzi 312 wizyt
0 głosów
1 odpowiedź 277 wizyt
0 głosów
2 odpowiedzi 87 wizyt
pytanie zadane 6 stycznia 2018 w HTML i CSS przez kevin Gaduła (4,070 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

62,316 zapytań

108,446 odpowiedzi

226,391 komentarzy

35,096 pasjonatów

Przeglądających: 199
Pasjonatów: 7 Gości: 192

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...