我想知道为什么在调用函数时不会重新创建局部变量?
a
为什么变量 $sql = "SELECT id, titlu, link, poza, alt, keywords FROM istorie WHERE approved='1' LIKE '%''".$keyword."''%'='%''".$keyword."''%' ORDER BY RAND() LIMIT 3" ;
$query = mysqli_query($con, $sql);
if(!$query){
printf("Error: %s\n", mysqli_error($con));
exit();}
$istorielist = '';
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){
$id = $row["id"];
$titlu = $row["titlu"];
$link = $row["link"];
$poza = $row["poza"];
$alt = $row["alt"];
$istorielist .= '<div id="articol-content-more"><a href="/istorie/'.$link.'"><img src="/images/'.$poza.'.jpg"class="articol-content-more-image" alt="'.$alt.'"><p class="articol-content-more-title">'.$titlu.'</p></a><span><a class="articol-content-more-afla" href="/istorie/'.$link.'">Citește mai multe</a></span><span class="articol-content-more-fl"><div class="fb-share-button" data-layout="button_count" data-href="http://esticurios.ro/istorie/'.$link.'"></div></span></div>';
}
mysqli_free_result($query);
每次映射到同一个内存地址?
答案 0 :(得分:5)
标准未定义局部变量的地址。从一个呼叫到下一个呼叫可能是相同的,或者它可能是不同的。
在这种特殊情况下,使用此代码并在您的机器和编译器上,地址很可能是相同的,因为每次调用func
时都会从main
调用它,因此堆栈被放置每次都一样。如果您要从main
拨打其他功能,然后拨打func
,则地址很可能会有所不同。
但是,这种行为不能依赖于此。
答案 1 :(得分:4)
每次都重新创建变量 ,但重复使用相同的地址,因为......好吧,为什么不呢?每次,它都是一个可用的内存位置,其中没有别的东西。为什么不用它?如果您每次都需要不同的位置,那么您最终会耗尽&#34;没有任何理由的记忆。您的系统可以方便地在同一功能中为同一个变量重复使用相同的位置。如果您的程序更复杂,那么您可能会看到不太可预测的行为。
答案 2 :(得分:2)
当堆栈处于相同状态时调用函数时,您已经证明堆栈变量可能位于同一地址。
为什么不在堆栈处于不同状态时尝试调用该函数?例如,使其递归:
#include <iostream>
using namespace std;
void func(int n)
{
int a = 0;
cout << "n=" << n << ": " << &a << endl;
if (0 < n)
func(n-1);
}
int main()
{
func(5);
return 0;
}
示例输出:
n=5: 0x7fff519aa848
n=4: 0x7fff519aa808
n=3: 0x7fff519aa7c8
n=2: 0x7fff519aa788
n=1: 0x7fff519aa748
n=0: 0x7fff519aa708
正如您所看到的,每次调用func()
都会使堆栈处于不同的状态,因此a
的地址每次都可能不同。