2016-07-25 21 views
2

Ich habe zwei Code-Abschnitte wie unten, in Perl und C. Dies ist über Perls my Variablen und C automatische Variablen. Zu einem gewissen Grad sind sie ziemlich ähnlich, da sie jedes Mal initialisiert werden, wenn sie die Funktion betreten. Aber Perl kann auf my Variablen einer Subroutine verweisen, C wird einen zufälligen Wert erhalten, wenn dies geschieht, weil der Funktionsaufrufstapel nach der Rückkehr zerstört wird. Weiß jemand, wie Perl diese Funktion implementiert? Es könnte nicht jeden Unterroutinenaufrufstapel unberührt lassen, ist es, dass Perl jede my Variable zuweist, die in einem Unterprogramm in "Datensegment" erstellt wurde (im Vergleich zum Stapel)?Wie implementiert Perl globale Referenz auf private Variable eines Unterprogramms?

Perl-Code:

use strict; 
use warnings; 

my $ref; 

sub func 
{ 
    my $str = "hello"; 
    $ref = \$str; 
} 
func; 
print "value is "; 
print "${$ref}\n"; 

C-Code:

#include <stdio.h> 

int *pi; 

void func(void) 
{ 
    int j = 9; 
    pi = &j; 
} 

int main(void) 
{ 
    func(); 
    printf("value is "); 
    printf("%d\n", *pi); 
    return 0; 
} 

Danke,

Antwort

0

Sie Ihre globale Variable auf eine Referenz auf bestimmte Daten in der Funktion erstellt lokal einstellen.

In Perl (eine "managed memory" -Sprache) wird dies ein "Objekt" sein, das als Verweis gezählt wird (hier wird der Begriff lose verwendet, da es sich um eine Zeichenfolge handelt), bis alle Referenzen wegfallen.

In C ist dies nur eine Speicheradresse, und Sie müssen selbst sicherstellen, dass sie gültig bleibt (und nicht auf Stack-Speicherplatz zeigt, der bereits zurückgewonnen wurde, sobald die Funktion zurückgegeben wurde).

+0

Hi @Thilo Um die Referenzzählung für meine Variablen eines Unterprogramms verfügbar zu machen, bedeutet das, dass meine Variable im Datensegment gespeichert wird, wenn auf sie verwiesen wird? Und im Stapel gespeichert, wenn es nicht referenziert ist? – password636

+0

Ich denke, alle Variablen in Perl sind im verwalteten Heap-Bereich, anstatt einen automatischen Stapel zugeordnet. Wenn die Subroutine beendet wird, nimmt die Anzahl der Referenzen für alle lokalen Variablen ab und wird normalerweise Null, es sei denn, Sie haben eine andere Referenz dafür erstellt. Das ist so, als würden Sie Objekte in Java verwenden (im Gegensatz zu Primitiven, die Stack-Allocated sein können und eher in Ihrem C-Beispiel sind). – Thilo