Wątek przeniesiony 2016-05-13 11:09 z C/C++ przez ŁF.

konwersja dec na bin w funkcji

0

Witam, mam problem w wydawało by się łatwym programie i nie mogę dojść co jest nie tak, mianowicie mam do napisania program, który zamienia podaną liczbę dziesiętną na liczbę binarną, zamiana przebiega w funkcji, 1 i 0 są wpisywane do tablicy charów i ta tablica jest zwracana a mój problem polega na tym, że wyświetlane są krzaki, zamiast tablicy, oto kod:

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

char *dec_na_bin(int x)
{
	int i, k;
	char *tab;
	
	tab = (char*)malloc(32 * sizeof(char));

	for (i = 31; i >= 0; i--)
	{
		k = x >> i;

		if (k & 1)
			tab[31-i] = "1";
		else
			tab[31-i] = "0";
	}
	return tab;
}

int main()
{
	int x, i, k;
	char *bin;

	printf("Podaj liczbe w systemie dziesietnym: \n");
	scanf_s("%d", &x);

	printf("\n");

	bin = (char*)malloc(32 * sizeof(char));

	bin = dec_na_bin(x);

	printf("Liczba %d w systemie binarnym to:\n%s", x, bin);

	getch();
    return 0;
}

 
3

Przypisujesz wskaźniki (literały stringowe zdecayowane na wskaźniki do ich pierwszych elementów) do charów. '0' zamiast "0" i analogicznie dla jedynki.

Swoją drogą, w Twoim kodzie aż roi się od wycieków pamięci. Najpierw alokujesz pamięć do bin, potem gubisz do niej wskaźnik bo dec_na_bin alokuje swoją, a potem i tak jej nie zwalniasz.

0

zamiana " na ' pomogła, ale nie do końca, wyświetlane są już poprawnie liczby w systemie binarnym, ale nadal pokazywane są krzaki, screen w załączniku

ps. możesz dokładniej wyjaśnić o co chodzi w tych wyciekach pamięci? chodzi tylko o to, że nie zwalniam jej funkcją free()? czy coś jeszcze?

2

Masz krzaczki, bo brakuje ci zera binarnego na końcu tablicy char*.

Wyciek pamięci jest tu:

bin = (char*)malloc(32 * sizeof(char)); //Alokujesz pamięć
bin = dec_na_bin(x); //Gubisz wskaźnik na zaalokowaną pamięć.
0

dodanie '\0' na końcu pomogło, dzięki :)

chyba dalej do końca nie rozumiem tego zagubionego wskaźnika, mógłbyś podać rozwiązanie jak uniknąć w tym kodzie wycieku pamięci?

2

Alokujesz pamięć na tablicę w funkcji i zwracasz jej adres do bin,
więc wcześniejsza alokacja w main jest zastąpiona tą z funkcji.
W main jest niepotrzebna, bo i tak jej nie używasz.

  • alokuj pamięć na tablicę w funkcji
  • zwróć adres tablicy do wskaźnika bin w main
  • zwolnij na konic pamięć free()
0

dziękuję za pomoc i za wytłumaczenie, problem rozwiązany :)

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