Wydrukuj adres lub wskaźnik wartości w C


80

Chcę zrobić coś, co wydaje się dość proste. Otrzymuję wyniki, ale problem polega na tym, że nie mam możliwości sprawdzenia, czy wyniki są prawidłowe.

Pracuję w C i mam dwie wskazówki; Chcę wydrukować zawartość wskaźnika. Nie chcę wyłuskiwać wskaźnika, aby uzyskać wskazaną wartość, chcę tylko adresu, który przechowuje wskaźnik.

Napisałem następujący kod i muszę wiedzieć, czy jest poprawny, a jeśli nie, jak mogę go poprawić.

Podczas gdy to publikuję (i dlatego ważne jest, aby było poprawne) jest to, że ostatecznie muszę to zrobić dla wskaźnika do wskaźnika. To jest:


To, co napisałeś, jest poprawne, jaki dokładnie problem masz?
Luca Matteis

Jak opisałem, uzyskiwałem wyniki, ale nie miałem możliwości dowiedzenia się, czy są one prawidłowe, czy też przynoszą mi śmieci. Don i inni poniżej (a także Ty) potwierdzili, że te wyniki są prawidłowe.
Frank V

Odpowiedzi:


29

To, co masz, jest poprawne. Oczywiście zobaczysz, że emp1 i item1 mają tę samą wartość wskaźnika.


1
Nie będą takie same, jeśli typ item1 jest częścią wielokrotnego dziedziczenia i / lub jest przodkiem Emp, w zależności od tego, jak kompilator przedstawia każdą z klas, które składają się na typ item1.
Jim Buck

2
@Jim: Znacznik „C” sugeruje inaczej
Hasturkun

1
@Jim: Hasturkun ma rację. Pracuję w C. Powinienem to opublikować.
Frank V

39

Aby wydrukować adres we wskaźniku do wskaźnika:

aby raz wyłuskać i wydrukować drugi adres:

Zawsze możesz zweryfikować za pomocą debuggera, jeśli używasz Linuksa dddi wyświetlasz pamięć, lub po prostu gdb, zobaczysz adres pamięci, dzięki czemu będziesz mógł porównać z wartościami w swoich wskaźnikach.


16

Uważam, że byłoby to najbardziej poprawne.

printf()jest funkcją wariadyczną i muszą być przekazywane argumenty odpowiednich typów. Standard mówi, że %pbierze void *.


Wyobrażam sobie, że są promowani? Nie jestem pewien, czy ktoś może wyjaśnić?
RastaJedi

4
Po pewnych badaniach nie są one automatycznie promowane. Rzut do void *jest rzeczywiście wymagany.
RastaJedi

10

Ponieważ wydaje się, że rozwiązałeś już podstawowe wyświetlanie adresu wskaźnika, oto jak sprawdzić adres podwójnego wskaźnika:

Możesz uzyskać dostęp do adresu podwójnego wskaźnika a, wykonując:


printf("which contains this value: %c\n" **a);chciałem tylko to dodać ^. ^.
RastaJedi

4

wynik:

ptr: 0xbfb4027f, wartość: A, a także adres: 3216245375


0

Byłem w tej sytuacji, zwłaszcza z nowym sprzętem. Proponuję napisać własny mały zrzut szesnastkowy. Będziesz mógł zobaczyć dane i adresy, pod którymi się znajdują, pokazane razem. To dobra praktyka i budująca pewność siebie.


3
kosztem bycia ignorantem - czy mógłbyś wyjaśnić, jak można napisać taką rutynę?
Faisal Vali

1
Także ta odpowiedź może być bardziej odpowiednia jako komentarz?
RastaJedi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.