rzutowanie dowolnego typu na char* i odwrotnie

0

Witam,
potrzebuję rzutować dowolne typy danych na char* i odwrotnie.

1

No i w czym problem? Potrzebujesz to rzutuj ;]

1

Dodatkowo standard zapewnia, że nigdy nie będzie to problem.
Więc do roboty :)

0

Rzutowanie czy konwertowanie do stringa? Może autor nie rozróżnia.

0
Wibowit napisał(a):

Rzutowanie czy konwertowanie do stringa? Może autor nie rozróżnia.

Możesz traktować to jako konwertowanie do stringa, bo jest coś takiego jak .c_str(), ale chodzi mi o konkretne bajty. Gdy mam inta to nie chcę napisu typu "12048", chcę reprezentację binarną inta w typie char* co wygląda np. tak ")u_#".

0

Żeby uniknąć konwersji musisz rzutować adresy (wskaźniki/ referencje/ stałe adresy/ cokolwiek).

A a = cośtam;
A * ap = &a;
B * bp = (B*)ap;
B b = *bp;

Na co dzień w C/ C++ nie kodzę, więc mogłem coś pokręcić, ale mniej więcej takie coś powinno zadziałać.

Możesz olać ostatnią dereferencję, za typ A wstawić int, za typ B wstawić char i dostaniesz to co chcesz, czyli interpretację inta jako char *.

Jest tylko pewien haczyk - takie konwersje są chyba UB, a na reprezentację wpływa endianess.

1
Wibowit napisał(a):

Jest tylko pewien haczyk - takie konwersje są chyba UB, a na reprezentację wpływa endianess.

Nie do końca. Generalnie można castować takie rzeczy:

  • X* <-> Y*, gdzie X* i Y* to zwykłe wskaźniki (nie wskaźniki na funkcje) i ich alignment jest zgodny (dla casta X* -> char* alignment jest zawsze zgodny)
  • X* <-> void*, gdzie X* to zwykły wskaźnik (nie wskaźnik na funkcję)
  • X* <-> Y*, gdzie X* i Y* to wskaźniki na funkcje

Warto dodać, że dereferencja tak skonwertowanego pointera jest poprawna (zagwarantowana przez standard) tylko dla cast X* -> char*.

0
int n = 99931;

char *c = new char[4];
c = (char*) &n;

for (size_t i = 0; i < 4; ++i)
	cout << *(c + i);

delete[] c;

Ten kod jest zły.

0

Oczywiście, że jest zły.

int n = 99931;
 
char *c = new char[4]; // tutaj c zawiera adres pamięci na stercie
c = (char*) &n; // a tutaj od razu przypisujesz adres ze stosu, więc po co wcześniejsza alokacja?
 
...
 
delete[] c; // a więc tutaj próbujesz zdealokować pamięć na stosie, WTF???

Jeśli chcesz sobie przekopiować to zrób takie coś:

int n = 12345;
char c[4];
memcpy(c, &n, 4);
for (int i = 0; i < 4; i++) {
  cout << c[i];
}
0

Zrobiłem tak:

template <typename T>

char* toCharPtr(T &t)
{
	char *c = new char[sizeof(t)];
	memcpy(c, &t, sizeof(t));
	return c;
}

template <typename D>

//tylko, że nie mogę wywołać tej funkcji
D fromCharPtr(char *c)
{
	D t = new T[sizeof(*c)];
	memcpy(t, c, sizeof(*c));
	return t;
}
 
0

Co to jest D? Nie powinno być T*?

Jak wywołujesz? Parametryzujesz szablon czy nie? Jeśli kompilator nie ma skąd zinferować parametru to się kompilacja wysypie, proste i logiczne.

0

Z T* też nie działa

0

Pokaż kod i błąd.

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