LPSTR, dziwny output

Odpowiedz Nowy wątek
2016-03-16 12:46
0
  #include <iostream>
 #include <windows.h>

 using namespace std;

int main()
{
    char s='l';
    LPSTR strpoint=&s;

    cout << strpoint << endl;
    return 0;
}

Dlaczego jest taki dziwny output zamiast normalnego adresu w pamięci zmiennej s?

Pozostało 580 znaków

2016-03-16 12:49
5

Rzutowanie zrób: cout << (void*)strpoint << endl;, czy tam cout << static_cast<void*>(strpoint) << endl; bardziej w stylu C++.

edytowany 2x, ostatnio: grzesiek51114, 2016-03-16 13:22
Zawsze preferuj static_cast jeśli to możliwe. - kq 2016-03-16 13:19
@kq a widzisz nawet nie wiedziałem, że w tym wypadku zadziała, ale rzeczywiście - przecież to zwykła konwersja. Tru. - grzesiek51114 2016-03-16 13:21

Pozostało 580 znaków

2016-03-16 13:14
3

Tak się dzieje ponieważ to na co wskazuje strpoint to jeden znak, a nie ciąg zakończony NULL jak by oczekiwał ostream, operator<< z ostream traktuje LPSTR jako wskaźnik na ciąg, a nie wskaźnik.


128 postów [25.06.2015r. 21:03]
edytowany 4x, ostatnio: bajos, 2016-03-16 18:30

Pozostało 580 znaków

2016-03-16 14:13

std::cout jest typu std::ostream, a typ ten ma przeładowany operator <<:
wewnętrznie: http://www.cplusplus.com/refe[...]tream/ostream/operator%3C%3C/
zewnętrznie: http://www.cplusplus.com/refe[...]stream/ostream/operator-free/

strpoint to u ciebie LPSTR czyli de facto const char *, czyli zostanie wykonany poniższy operator:

ostream& operator<< (ostream& os, const char* s);

I ten operator na wyjściu poda kolejne znaki, które leżą pod wskaźnikiem, aż będzie '\0'.
Jeśli chcesz aby był użyty inny operator, np. chcesz wyświetlić adres, no to musisz castować:

cout << (void *)strpoint;
cout << static_cast<void *>(strpoint);

Poza tym, sama idea:

char s='l';
LPSTR strpoint=&s;

jest średnia, ponieważ brakuje '\0' na końcu.


Asm/C/C++
edytowany 4x, ostatnio: mwl4, 2016-03-16 14:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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