de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
 letmutx
letmutx
Question

Dlaczego adresy argc i argv są oddalone od siebie o 12 bajtów?

Uruchomiłem następujący program na moim komputerze (64-bitowy Intel z systemem Linux).

#include <stdio.h>

void test(int argc, char **argv) {\i0}
    printf("[test] Argc Pointer: %p\n", &argc);
    printf("[test] Argv Pointer: %p\n", &argv);
}

Int main(int argc, char **argv) {\i0}
    Printf("Argc Pointer: %p\n", &argc);
    printf("Argv Pointer: %p\n", &argv);
    printf("Size of &argc: %lu\n", rozmiar (&argc)); printf("Rozmiar &argc: %lu\n", &argc);
    printf("Size of &argv: %lu\n", size of (&argv)); printf("Size of &argv: %lu\n", size of (&argv));
    test(argc, argv));
    powrót 0;
}

Wyjściem programu było

$ gcc rozmiar.c -o rozmiar
$ ./rozmiar
Argc Pointer: 0x7fffd7000e4c
Argv Pointer: 0x7fffd7000e40
Wielkość &argc: 8
Rozmiar &argv: 8
[test] Argc Pointer: 0x7fffd7000e2c
Argv Pointer: 0x7fffd7000e20

Rozmiar wskaźnika &argv wynosi 8 bajtów. Spodziewałem się, że adres argc będzie adresem (argv) + rozmiar (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8, ale pomiędzy nimi znajduje się 4-bajtowe wypełnienie. Dlaczego tak jest?

Zgaduję, że może to być spowodowane wyrównaniem pamięci, ale nie jestem pewien.

Zauważam to samo zachowanie przy funkcjach, które wywołuję.

30 2020-02-08T15:34:37+00:00 2
Angela Cojocari 17541
Edytowane pytanie 19. września 2021 в 7:35
 letmutx
letmutx
Edytowane pytanie 11. lutego 2020 в 3:55
Programowanie
c
memory-alignment
Popular videos
Pointers and dynamic memory - stack vs heap
Pointers and dynamic memory - stack vs heap
9 lat temu
What are command line arguments (argc and argv)?
What are command line arguments (argc and argv)?
2 lata temu
Masz problem z magistralą 1-wire? Rozwiąż go tanio i szybko! Z serii jak zrobić by było dobrze :)
Masz problem z magistralą 1-wire? Rozwiąż go tanio i szybko! Z serii jak zrobić by było dobrze :)
4 miesiące temu
Komunikacja po SPI, odczyt i zapis różnych pamięci
Komunikacja po SPI, odczyt i zapis różnych pamięci
4 miesiące temu
(+) Argumenty programu | Kurs C++ (2019) | Materiały dodatkowe
(+) Argumenty programu | Kurs C++ (2019) | Materiały dodatkowe
2 lata temu
Gdy Zasięg Internetu Nie Starcza Na Cały Dom | Przekaźniki Internetu Asus RP-N12
Gdy Zasięg Internetu Nie Starcza Na Cały Dom | Przekaźniki Internetu Asus RP-N12
2 lata temu
Programowanie AVR (fusebity, AtmelStudio, Atmega16, DDRx, PORTx) #1
Programowanie AVR (fusebity, AtmelStudio, Atmega16, DDRx, PORTx) #1
5 lat temu
How to Divide Big Numbers : Math Solutions
How to Divide Big Numbers : Math Solutions
8 lat temu
ARGOS PID MAX 7&quot; nowy algorytm PID.   oszczędności w opale
ARGOS PID MAX 7" nowy algorytm PID. oszczędności w opale
4 miesiące temu
PL/ENG RF 433MHz prosty nadajnik i odbiornik Atmega8
PL/ENG RF 433MHz prosty nadajnik i odbiornik Atmega8
2 lata temu
Co zrobić gdy nie ma złącza aRGB w płycie głównej? *Ledy Adresowalne ws2812b*
Co zrobić gdy nie ma złącza aRGB w płycie głównej? *Ledy Adresowalne ws2812b*
2 lata temu
Installing LED Tape Lighting
Installing LED Tape Lighting
9 lat temu
Problem z SUPERSZYBKIMI kartami sieciowymi AQUANTIA
Problem z SUPERSZYBKIMI kartami sieciowymi AQUANTIA
1 rok temu
Jak wyłączyć podświetlenie w obudowie SilentiumPC aRGB?
Jak wyłączyć podświetlenie w obudowie SilentiumPC aRGB?
1 rok temu
VGA Spectrum&#39;у не нужен.
VGA Spectrum'у не нужен.
4 miesiące temu
Z jakich routerów korzystasz ??? ASUS DSL-AC68u , TP-LINK W9980 ADRIANxPL
Z jakich routerów korzystasz ??? ASUS DSL-AC68u , TP-LINK W9980 ADRIANxPL
7 lat temu
Wyginające się GPU w slocie? - Podstawka DeepCool GH-01 ARGB!
Wyginające się GPU w slocie? - Podstawka DeepCool GH-01 ARGB!
9 miesięcy temu
« Poprzedni
Następny »
Solution / Answer
Eric Postpischil
Eric Postpischil
8. lutego 2020 в 3:53
2020-02-08T15:53:20+00:00
Więcej
Źródło
Edytuj
#42384961

W twoim systemie kilka pierwszych argumentów w postaci liczb całkowitych lub wskaźników jest przekazywanych w rejestrach i nie ma adresów. Gdy weźmiesz ich adresy z &argc lub &argv, kompilator musi sfabrykować adresy, wpisując zawartość rejestru do stosu lokalizacji i podając adresy tych stosów. Czyniąc to, kompilator wybiera, w pewnym sensie, cokolwiek się stanie z lokalizacjami stosu, które są dla niego wygodne.

Angela Cojocari 17541
Edytowana odpowiedź 19. września 2021 в 7:36
57
0
John Bollinger
John Bollinger
8. lutego 2020 в 4:08
2020-02-08T16:08:00+00:00
Więcej
Źródło
Edytuj
#42384962

Dlaczego adresy argc i argv są od siebie oddalone o 12 bajtów?

Z punktu widzenia standardu językowego, odpowiedź brzmi "brak konkretnego powodu". C nie określa ani nie implikuje żadnej zależności pomiędzy adresami parametrów funkcji. @EricPostpischil opisuje, co prawdopodobnie dzieje się w Twojej konkretnej implementacji, ale te szczegóły byłyby inne dla implementacji, w której wszystkie argumenty są przekazywane na stosie, a to nie jest jedyna alternatywa.

Co więcej, mam problem z wymyśleniem sposobu, w jaki takie informacje mogłyby być użyteczne w programie. Na przykład, nawet jeśli "wiesz", że adres argv jest 12 bajtów przed adresem argc, to nadal nie ma zdefiniowanego sposobu na obliczenie jednej z tych wskazówek od drugiej.

Angela Cojocari 17541
Edytowana odpowiedź 19. września 2021 в 7:36
9
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
Zuxriddin Muydinov
Zarejestrowany 13 godzin temu
2
Денис Анненский
Zarejestrowany 2 dni temu
3
365
Zarejestrowany 1 tydzień temu
4
True Image
Zarejestrowany 1 tydzień temu
5
archana agarwal
Zarejestrowany 1 tydzień temu
DE
ES
FR
IT
JA
NL
PL
PT
RU
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem