Es macht einfach das, was Sie tun, es ist nichts falsch daran, außer dass es wahrscheinlich nicht das ist, was Sie wollen.
Es weist also nur die Adresse i
ptr
an dem Punkt, den Sie zuweisen. Wenn Sie func
verlassen, wird dieser Zeiger ungültig.
Hinweis Dieses Verhalten ist vollständig definiert: Die Adresse i
an der Stelle, die Sie der globalen Variablen zuweisen, ist definiert, und Sie können sie zuweisen. Das Problem kommt erst später zum Tragen, wenn Sie versuchen, die Variable zu dereferenzieren, nachdem Sie die Funktion func
verlassen haben. Solange Sie nur die globale Variable in func
verwenden, gibt es kein Problem (außer dass eine globale Variable wirklich bedeutungslos ist).
An dieser Stelle existiert diese Variable nicht mehr. Und es ist sehr wahrscheinlich, dass Sie entweder einen segfault erhalten oder zumindest einige seltsame Zahlen erhalten (weil Sie den alten Stapelrahmen mit einigen anderen Werten überschrieben haben).
nur als Randnotiz: Was ich mit diesem Stack-Frame, was bedeuten. Sie können diesen Code versuchen, auf die meisten Compiler (ohne Optimierungen!)
#include <stdio.h>
int *ptr;
void f1() {
int i = 0;
ptr = &i;
}
void f2() {
int i = 1;
}
int main() {
f1();
printf("%d\n", *ptr);
f2();
printf("%d\n", *ptr);
}
Ohne Optimierungen, wird dies höchstwahrscheinlich
0
1
drucken Da die Variable i
die gleiche Adresse haben, wenn f1
und f2
Aufruf von main()
.
Mit Optimierungen wird der Aufruf an f2()
optimiert.
Immer noch: Dies ist undefiniertes Verhalten und muss nicht durchgeführt werden.
undefiniertes Verhalten für Call-Expression nicht die Art der aufgerufenen Funktion entsprechen. – EOF
Ihre Aufgabe ist korrekt; Nach Verlassen von 'func' existiert die Variable' i' jedoch nicht mehr und Sie haben von da an undefiniertes Verhalten. –
Nachschlagen 'Dangling pointer' –