<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>.::Escovando Bits::. &#187; programação</title>
	<atom:link href="http://escovandobits.wordpress.com/tag/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://escovandobits.wordpress.com</link>
	<description>Programação, Linux, tecnologia da informação, dicas, artigos</description>
	<lastBuildDate>Sun, 05 Jul 2009 15:42:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='escovandobits.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ac8d2c79730f1bc1a6ebab006a3670da?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>.::Escovando Bits::. &#187; programação</title>
		<link>http://escovandobits.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://escovandobits.wordpress.com/osd.xml" title=".::Escovando Bits::." />
		<item>
		<title>Retorno de referências a variáveis locais</title>
		<link>http://escovandobits.wordpress.com/2007/11/24/retorno-de-referencias-a-variaveis-locais/</link>
		<comments>http://escovandobits.wordpress.com/2007/11/24/retorno-de-referencias-a-variaveis-locais/#comments</comments>
		<pubDate>Sat, 24 Nov 2007 21:27:38 +0000</pubDate>
		<dc:creator>Mauro Rodrigues</dc:creator>
				<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/2007/11/24/retorno-de-referencias-a-variaveis-locais/</guid>
		<description><![CDATA[Retornar referências a variáveis locais é um erro comum entre muitos programadores inexperientes quando começam a trabalhar com funções que manipulem vetores, seja qual for o tipo em questão, ou mesmo ponteiros. Motivado por isso e por um festival dessas referências que andei presenciando, resolvi tratar o assunto.
Mas você jovem padawan da computação deve estar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=12&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Retornar referências a variáveis locais é um erro comum entre muitos programadores inexperientes quando começam a trabalhar com funções que manipulem vetores, seja qual for o tipo em questão, ou mesmo ponteiros. Motivado por isso e por um festival dessas referências que andei presenciando, resolvi tratar o assunto.</p>
<p align="justify">Mas você jovem padawan da computação deve estar se perguntando: &#8220;Que raios é isso de referência a uma variável local? E qual o problema em retorná-las?&#8221;</p>
<p align="justify">O retorno de uma referência local se dá quando retornamos um ponteiro (endereço) de um dado &#8216;X&#8217;, sendo ele escopo local,  para a função chamadora. Veja o exemplo a seguir, feito em C++&#8230;</p>
<p><span id="more-12"></span></p>
<pre class="brush: cpp;">
#include&lt;iostream&gt;

using namespace std;

int *baz(void);

int main(int argc, char *argv[]){
    int *i;
    i = NULL;
    cout&lt;&lt;&quot;i antes da chamada a baz(): &lt;null&gt;&quot;&lt;&lt;endl;
    i = baz();
    cout&lt;&lt;&quot;i pós chamada de baz(): &quot;&lt;&lt;*i&lt;&lt;endl;
    return 0;
}

int *baz(void){
    int k=8;
    cout&lt;&lt;&quot;valor de k: &quot;&lt;&lt;k&lt;&lt;endl;
    return &amp;k;
}</pre>
<p align="justify">Compilando temos:</p>
<blockquote>
<p align="justify">
<address><em>$g++ baz.cpp -o baz</em></address>
<address><em>baz.cpp: In function &#8216;int *baz()&#8217;:</em></address>
<address><em>baz.cpp:5: Warning: address of local variable &#8216;k&#8217; returned</em></address>
</blockquote>
<p align="justify">Sim! Um Warining&#8230; <span style="text-decoration:line-through;">nada demais, quem nunca utilizou um código mesmo com warnings?</span> Mas esse warning é um perigo! E vocês já saberão o porque.</p>
<p align="justify">Continuando, agora vamos executar:</p>
<blockquote>
<p align="justify">
<address>$./baz</address>
<address>i antes da chamada a baz(): &lt;null&gt;</address>
<address>valor de k: 8</address>
<address>i apos a chamada de baz(): 8 </address>
</blockquote>
<p align="justify">É&#8230; deu certo. Melhor tentarmos um exemplo mais elaborado. É praticamente a mesma coisa, exceto que dessa vez iremos encher <span style="text-decoration:line-through;">linguiça</span> PILHA:</p>
<pre class="brush: cpp;">
#include&lt;iostream&gt;
#include&lt;cmath&gt;

using namespace std;

int *baz(void);
void do_nothing(void);

int main(int argc, char *argv[]){
    int *i;
    i = NULL;
    cout&lt;&lt;&quot;i antes da chamada a baz(): &lt;null&gt;&quot;&lt;&lt;endl;
    i = baz();

    cout&lt;&lt;&quot;i apos chamada de baz(): &quot;&lt;&lt;*i&lt;&lt;endl;

    pow(2.0,2.0); /*Sim, isso nao serve de nada!*/
    do_nothing();

    cout&lt;&lt;&quot;i apos chamada de baz() &quot;&lt;&lt;*i&lt;&lt;endl;    

    return 0;
}

void do_nothing(void){
    int a,b,c,d,e,f,g,h;
    cout&lt;&lt;&quot;Eu nao faco nada!!! So encho a PILHA!&quot;&lt;&lt;endl;
}

int *baz(void){
    int k=8;
    cout&lt;&lt;&quot;valor inicial de k: &quot;&lt;&lt;k&lt;&lt;endl;
    return &amp;k;
}</pre>
<p align="justify">E o resultado da execução:</p>
<blockquote>
<p align="justify">
<address>$./baz</address>
<address>i antes da chamada a baz(): &lt;null&gt;</address>
<address>valor inicial de k: 8</address>
<address>i apos a chamada de baz(): 8 </address>
<address> Eu nao faco nada!!! so encho a PILHA!</address>
<address>i apos chamada de baz(): 134519904  &lt;&#8212;&#8212;AHÁÁÁÁÁÁÁÁ</address>
</blockquote>
<p align="justify">Aí está! A variável &#8216;i&#8217; se corrompeu! Não ela não foi pro lado negro da Força, ela possui dados duvidosos e, portanto, inválidos (e põe inválidos nisso).</p>
<p align="justify">Mas porque? Tudo estava funcionando tão bem!</p>
<p align="justify">A explicação se baseia no conceito de pilha de dados no programa; Essa pilha é onde são empilhadas as variáveis das funções e os endereços de retorno para a função chamadora, seria mais ou menos assim:</p>
<p style="text-align:center;"><img src="http://i22.photobucket.com/albums/b317/darth_maurus/0.jpg" alt="Como uma pilha de dados funciona." /></p>
<p align="justify">No primeiro exemplo o retorno do endereço de k não foi prejudicado pois a área na pilha onde a função, e conseqüentemente os dados,  estavam alocados havia sido removida, mas não sobrescrita (nessa tipo de remoção, ao contrário da estrutura de dados pilha, apenas o ponteiro topo &#8220;desce&#8221; para o elemento abaixo), ou seja, os dados estavam, por pura sorte, preservados; Mas ao chamarmos as funções pow() e do_nothing(), no segundo exemplo, a pilha foi sobrescrita , causando o corrupção natural e correta da informação que residia no endereço onde inicialmente estava k enquanto sua função ainda executava.</p>
<p align="justify">Bem, a idéia desse meu primeiro post era essa, trazer a você, iniciante em programação, uma idéia geral de porque não retornar um referência a uma variável local. Afinal de contas esse tipo de retorno não se faz necessário uma vez que poderíamos passar uma variável que recebesse esse endereço como parâmetro da função, ou na pior das hipóteses retornar uma referência a variável local, desde que esta seja declarada como estática (static). Entretanto, apesar de segura essa última abordagem deve ser evitada uma vez que a variável em questão passaria a atuar quase como global, entre a função chamada e a função chamadora, o que não é boa prática de programação.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=12&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2007/11/24/retorno-de-referencias-a-variaveis-locais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a25d3fe89c0b28671ec6b0a9d7324102?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mauro Rodrigues</media:title>
		</media:content>

		<media:content url="http://i22.photobucket.com/albums/b317/darth_maurus/0.jpg" medium="image">
			<media:title type="html">Como uma pilha de dados funciona.</media:title>
		</media:content>
	</item>
	</channel>
</rss>