2016-07-25 66 views
2

我在Perl和C中有兩個代碼段,分別是Perl的my變量和C的自動變量。在某種程度上,它們非常相似,因爲它們每次進入函數都會被初始化。但Perl可以引用子例程的變量my,如果這樣做,C將得到隨機值,因爲函數調用堆棧在返回後被銷燬。任何人都知道Perl如何實現這個功能?它不能保持每個子程序調用堆棧不變,是Perl分配在「數據段」中的子程序中創建的每個my變量(與堆棧相比)嗎?Perl如何實現對子程序的私有變量的全局引用?

Perl代碼:

use strict; 
use warnings; 

my $ref; 

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

C代碼:

#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; 
} 

感謝,

回答

0

您在您的全局變量設置爲參考在功能本地創建的一些數據。在Perl(一種「託管內存」語言)中,這將是一個引用計數的「對象」(使用術語鬆散,因爲它是一個字符串),直到所有引用消失纔會被垃圾收集。

在C中,這只是一個內存地址,您必須確保自己保持有效(並且不會指向一旦函數返回就已經回收的堆棧空間)。

+0

您好@Thilo爲了使引用計數可用於我的子程序變量,這是否意味着我的變量將被存儲在數據段中,如果它被引用?如果沒有被引用,那麼存儲在堆棧中? – password636

+0

我認爲Perl中的所有變量都分配在託管堆區域,而不是自動堆棧。如果子程序退出,則所有局部變量的引用計數將減少,通常變爲零,除非您爲其創建了另一個引用。這就像在Java中使用對象(與基元相反,基元可以堆棧分配,更像是你的C例子)。 – Thilo