ich über Speicherverwaltung studierte und ich kam in diesem Code:Pointer, dass funktionieren wurde von Code kopiert
void print(const char * str){
printf(str);
}
void (*print_ptr)(const char *)=print;
void foo2(void){
print("goo\n");
return;
}
void baz(void){
print("foo\n");
return;
}
int main()
{
char buf[256];
void (*func_ptr)(void)=(void (*)(void))buf;
memcpy(buf,foo2,((void *)baz)-((void *) foo2));
func_ptr();
return 0;
}
Dieser Code wird seg Fehler verursacht
func_ptr();
erreicht Ich kann nicht verstehen, warum. Wenn ich den Zeiger so ändere, dass er auf eine statische Funktion zeigt (wie func_ptr=&baz
wird es richtig funktionieren, aber ein dynamischer Code wird nicht.
Der Code selbst, wie ich es verstehe, wird auf den Stack kopiert, wo er sein sollte.
?. Was ist mit diesem Code falsch ist
Betreff 2: Sie meinen, dass wenn eine Funktion aufgerufen wird, diese in eine relative Adresse (dh ein Offset) übersetzt wird. Wenn ich also diesen Teil kopiere, erreicht er beim Erreichen dieses Offsets a Speichersegment, dass es nicht sollte? –
@YinonEliraz, nein, ich meine, innerhalb der Funktion könnte es sich auf eine relative Adresse 'PC + N' beziehen, die außerhalb der Funktion liegt, oder auf eine absolute Adresse' X', die innerhalb der Funktion liegt. Beide können Probleme verursachen, wenn die Funktion verschoben wird. – abligh
Hier sprechen wir über den Aufruf für die lokale Funktion drucken? –