Ich habe einfachen Code wie folgt:Welche Adresse druckt printf() mit einem% p-Format in c?
#include<stdio.h>
int glob;
int main(void)
{
int a;
printf("&a is : %p \n", &a);
printf("glob is : %p \n", &glob);
return 0;
}
Ausgabe des obigen Programms ist: Erster Lauf:
&a is : 0x7fff70de91ec
glob is : 0x6008f4
Zweiter Lauf:
&a is : 0x7fff38c4c7ac
glob is : 0x6008f4
Ich studiere über virtuelle & physikalische Adressen. Ich habe folgende Frage:
- der die gedruckte Adresse (physische/virtuelle) der Variablen „a“ ist?
- Wenn es dann virtuell ist, wie ändert es sich bei jedem Lauf desselben Programms? Wie ich verstanden, Compiler bietet virtuelle Adresse zu Variablen bei der Kompilierung?
- Warum ist die Adresse der globalen Variablen in jedem Programmlauf konstant?
In diesem Programm unter Linux ausgeführt: 2.6.18-308.el5 x86_64 GNU/Linux
mit Zusammengestellt: gcc Version 4.1.2 20.080.704 (Red Hat 4.1.2-52)
Ihr Programm ruft ** undefiniertes Verhalten ** auf. Ein '% p' muss ein ptr-to-void haben, also müssen Sie in beiden printfs auf' (void *) 'umwandeln. – Jens
@Jens Wird das Argument nicht implizit auf "void *" übertragen? –
@VilhelmGray Implizite Konvertierungen finden statt, wenn ein Typ erwartet wird, aber es gibt keine Typen in Variadic-Funktionen. – effeffe