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;
}
感謝,
您好@Thilo爲了使引用計數可用於我的子程序變量,這是否意味着我的變量將被存儲在數據段中,如果它被引用?如果沒有被引用,那麼存儲在堆棧中? – password636
我認爲Perl中的所有變量都分配在託管堆區域,而不是自動堆棧。如果子程序退出,則所有局部變量的引用計數將減少,通常變爲零,除非您爲其創建了另一個引用。這就像在Java中使用對象(與基元相反,基元可以堆棧分配,更像是你的C例子)。 – Thilo