mam prosty kod w następujący sposób:Jaki jest adres wydrukowany przez printf() z% p formacie wc?
#include<stdio.h>
int glob;
int main(void)
{
int a;
printf("&a is : %p \n", &a);
printf("glob is : %p \n", &glob);
return 0;
}
Wyjście z powyższego programu jest: Pierwszy bieg:
&a is : 0x7fff70de91ec
glob is : 0x6008f4
Drugi bieg:
&a is : 0x7fff38c4c7ac
glob is : 0x6008f4
uczę o wirtualne & adresy fizyczne. Mam następujące pytanie:
- Jaki jest wydrukowany adres (fizyczny/wirtualny) zmiennej "a"?
- Jeśli to jest wirtualne, to jak zmienia się w każdym uruchomieniu tego samego programu? Jak rozumieć kompilator zapewnia wirtualny adres do zmiennych w czasie kompilacji?
- Dlaczego adres zmiennej globalnej jest stały w każdym uruchomieniu programu?
W ten program wykonywany w systemie Linux: 2.6.18-308.el5 x86_64 GNU/Linux
Opracowano na podstawie: wersję gcc 4.1.2 20.080.704 (Red Hat 4.1.2-52)
Twój program wywołuje ** niezdefiniowane zachowanie **. '% P' musi mieć wartość ptr-to-void, więc musisz rzutować na' (void *) 'w obu printfs. – Jens
@Jens Czy argument nie byłby domyślnie rzutowany na 'void *'? –
@VilhelmGray niejawne konwersje mają miejsce, gdy typ jest oczekiwany, ale nie ma typów w funkcjach variadic. – effeffe