<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-759566917886277152</id><updated>2011-08-29T07:18:40.595-07:00</updated><category term='Segurança'/><category term='Ponteiros em C'/><title type='text'>Online Programming</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-2320305218979948937</id><published>2010-10-01T14:18:00.000-07:00</published><updated>2010-10-02T10:37:22.148-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ponteiros em C'/><title type='text'>Ponteiros em C - Parte 2</title><content type='html'>Bem, nesta 2ª parte vamos basicamente aplicar tudo o que aprendemos na primeira parte.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Sumariando:&lt;/i&gt;&lt;br /&gt;* Resolver o problema da criação de uma função para a troca de valores entre duas variáveis.&lt;br /&gt;* Aritmética de ponteiros.&lt;br /&gt;* Comparação de ponteiros.&lt;br /&gt;&lt;br /&gt;Vamos começar por resolver o segundo problema apresentado na parte 1 deste artigo que é o problema de criar uma função que dados dois argumentos para essa mesma função trocar o valor entre eles.&lt;br /&gt;&lt;br /&gt;Vamos primeiro perceber por que razão é que uma solução como passar argumentos "normais" não resulta. &lt;br /&gt;Ora bem, quando nós chamámos uma função é criado, como já disse, o seu stack frame. Nesse stack frame vão estar também as variáveis criadas como argumento. Por exemplo, se tivessemos uma definição assim: void fun (int x, int y). Neste caso seria criada, quando chamada, no stack frame da função fun uma variável x e uma variável y. Quando fossemos a chamar esta função, por exemplo assim: fun (10, 20), estaríamos a passar o quê realmente? Estaríamos a passar o valor 10 para a variável x e o valor 20 para a variável y! Ou seja, chamar a função assim: fun (10, 20) é o mesmo que fazer: x = 10, y = 20. Acontecia exactamente o mesmo se fossemos a fazer:&lt;br /&gt;int k = 10, j = 20;&lt;br /&gt;fun (k,j);&lt;br /&gt;&lt;br /&gt;Neste caso nós na função fun não estaríamos a trabalhar realmente com k e j mas sim com os seus valores! Ou seja, era a mesma coisa que fazer: x = k, y = j! É muito importante reter esta ideia: quando chamámos uma função com argumentos é na realidade passado para essa função o valor dos argumentos e não os argumentos em si! &lt;br /&gt;A partir disto a questão continua: como é que então vamos trabalhar com os argumentos em si, visto que é isso mesmo que nós queremos, alterá-los...?&lt;br /&gt;Outra vez, a solução passa por utilizar ponteiros. Se nós arranjássemos maneira de conseguir ter o endereço das variáveis na função que vamos criar e se tivéssemos um ponteiro para as manipular e modificar podíamos alterá-las realmente! Ora, isto é perfeitamente possível de o fazer, basta fazer o seguinte:&lt;br /&gt;* Criar uma função que vai ter como argumentos dois ponteiros (que vão receber os endereços das variáveis de main).&lt;br /&gt;* Passar para essa função os endereços das variáveis.&lt;br /&gt;&lt;br /&gt;A partir daqui bastava utilizar o operador * para alterar o valor para onde os ponteiros apontam (variáveis da função main).&lt;br /&gt;&lt;br /&gt;Vamos então resolver este problema de uma vez por todas.&lt;br /&gt;&lt;a href="http://pastebin.com/fTgtZkZK"&gt;Exemplo nº 5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pus diversos comentários que penso serem importantes para entenderem bem isto!&lt;br /&gt;Então, no programa são passados para a função fun os endereços de k e de j para que nessa função possamos trabalhar com eles directamente, visto que o que vai receber esses valores vão ser dois ponteiros! A partir daí podemos trabalhar com essas variáveis directamente através do operador *. É importante que entendam bem este programa por isso não avancem mais no artigo sem o entender bem!&lt;br /&gt;&lt;br /&gt;Vou deixar, já agora uma imagem que relata a situação do nosso programa (com stack frames de main e fun).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LQpchALTVl0/TKb-62qWYpI/AAAAAAAAABc/9Rv5tW983wk/s1600/pt.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_LQpchALTVl0/TKb-62qWYpI/AAAAAAAAABc/9Rv5tW983wk/s320/pt.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5523382280075502226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se pensarmos um bocadinho vamos-nos lembrar de outra situação em que é preciso passar o endereço das variáveis para uma função bem conhecida por todos vocês! A função scanf:&lt;br /&gt;int x = 0;&lt;br /&gt;scanf ("%d", &amp;x);&lt;br /&gt;&lt;br /&gt;Por que razão é que temos de passar para a função scanf o endereço de x? Simplesmente porque a função scanf vai alterar o valor de x e vai "colocar" nele o valor introduzido pelo usuário. X encontra-se no stack frame de main, por exemplo (podia ser outra função qualquer) e nós estamos a criar outro stack frame para a função scanf! Para alterar o valor de x temos de "invadir" o stack frame da função onde se encontra x e depois alterar o seu valor com o valor introduzido pelo usuário. Se não passássemos o endereço de x e fizéssemos: scanf ("%d", x) estaríamos na realidade a passar para um ponteiro o valor de x, que neste caso é 0, então estaríamos a armazenar na posição 0 o valor introduzido pelo usuário, visto que foi passado para o ponteiro o valor 0, ou seja, ele iria apontar para a posição 0 na memória! Isto resultaria num segmentation fault.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Em construção [...]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-2320305218979948937?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/2320305218979948937/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/10/ponteiros-em-c-parte-2.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/2320305218979948937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/2320305218979948937'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/10/ponteiros-em-c-parte-2.html' title='Ponteiros em C - Parte 2'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_LQpchALTVl0/TKb-62qWYpI/AAAAAAAAABc/9Rv5tW983wk/s72-c/pt.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-1087050384968788740</id><published>2010-09-29T08:35:00.001-07:00</published><updated>2010-10-02T04:07:45.610-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ponteiros em C'/><title type='text'>Ponteiros em C - Parte 1</title><content type='html'>Penso que esta é a maior dor de cabeça de principiantes em C e em C++ também, além de existirem as referências que são muito mais simples de se utilizar. Uma vez dominados os ponteiros podem ser muito mas mesmo muito úteis em todas as vertentes da linguagem.&lt;br /&gt;&lt;br /&gt;Nesta primeira parte vamos:&lt;br /&gt;* Compreender o conceito&lt;br /&gt;* Utilizar e compreender os operadores &amp;amp; e *.&lt;br /&gt;&lt;br /&gt;Temos muitos exemplos diários que se assemelham à utilização de ponteiros. Vou dar um exemplo que penso ser o melhor. Imaginemos que estamos a escrever manualmente um documento (não muito formal) e que nesse documento existe algum termo técnico ou conceito que nem toda a gente entende. O que fazemos é um referência a essa palavra no final do parágrafo ou até no final do próprio documento.&lt;br /&gt;&lt;br /&gt;Exemplo:&lt;br /&gt;"[...] os ponteiros[1] são muito úteis [...]".&lt;br /&gt;[1] Em programação, um ponteiro ou apontador é um tipo de dado de uma linguagem de programação cujo valor se refere diretamente a um outro valor alocado em outra área da memória, através de seu endereço. Um ponteiro é uma simples implementação do tipo referência da ciência da computação. &lt;em&gt;@pt.wikipedia.org&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Podemos ver neste exemplo bastante simples que o [1] no texto em si faz referência ao [1] que, neste caso, é a definição da palavra.&lt;br /&gt;&lt;br /&gt;Obviamente vocês perguntam o que é que isto tem a ver com a linguagem C e com programação. Este pequeno exemplo permite-nos explicar conceitos bastante importantes nesta matéria.&lt;br /&gt;&lt;br /&gt;Agora vou introduzir um problema que é bastante comum para a explicação de ponteiros.&lt;br /&gt;&lt;br /&gt;Como vocês sabem quando se chama uma função é criado na stack um stack frame para essa função (podem ver o meu artigo sobre buffer overflow), com todas as variáveis locais, etc. Ou seja, cada função tem o seu próprio stack frame (quando chamadas), logo nenhuma função poderá interferir com a variáveis de outra função visto que estão em regiões de memória diferentes. É aqui que os ponteiros nos vão ser úteis, eles vão permitir-nos realmente alterar o valor das variáveis de outras funções. Isto é apenas um exemplo introdutório, obviamente.&lt;br /&gt;&lt;br /&gt;Então vamos já escrever um programa em que vamos poder ver que não podemos realmente alterar o valor de variáveis de funções diferentes.&lt;br /&gt;&lt;a href="http://pastebin.com/XfN3ep51"&gt;Exemplo nº 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Meh, vocês olham para este problema e pensam "este tipo está a fazer as coisas mal", com os conhecimentos que vocês já têm conseguem resolver o problema facilmente! Como? Simples, usando o &lt;span style="font-style:italic;"&gt;return&lt;/span&gt;. Simples, retornámos o valor de &lt;span style="font-style:italic;"&gt;x&lt;/span&gt; modificado para a função main. Escrevendo novamente o código.&lt;br /&gt;&lt;a href="http://pastebin.com/MctuFdRs"&gt;Exemplo nº 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E pronto tinhamos o problema resolvido.&lt;br /&gt;&lt;br /&gt;Então vamos agora apresentar outro problema. Escrever uma função que dados dois valores x e y troca entre si os valores, ou seja:&lt;br /&gt;* x = 10, y = 20&lt;br /&gt;* fun (x,y)&lt;br /&gt;* x = 20, y = 10&lt;br /&gt;&lt;br /&gt;Este problema seria impossível de resolver se não tivessemos os ponteiros para ajudar! Não podemos fazer dois return's, ou seja, nunca vamos poder retornar os dois valores! Temos mesmo de arranjar uma forma de "invadir" o stack frame da função main e alterar lá os valores. Como fazer isto? Simples, ponteiros.&lt;br /&gt;Este problema vai ser resolvido numa próxima parte deste artigo. Primeiro temos de conhecer bem como trabalhar com ponteiros.&lt;br /&gt;&lt;br /&gt;Como repararam com certeza eu naquele pequeno "documento" pus uma definição para ponteiro. Basicamente um ponteiro é um tipo de dado que armazena nele um endereço de memória de outra variável ou objecto qualquer. Tudo em memória tem o seu endereço de memória, logo podemos ter o endereço de qualquer coisa e podemos ainda armazenar esse endereço num ponteiro. Com o ponteiro podemos ainda trabalhar directamente na variável para qual o ponteiro aponta, podemos alterar o seu valor, podemos realmente trabalhar com a variável em si através de um "comunicador" que é o ponteiro.&lt;br /&gt;&lt;br /&gt;O operador em C que nos retorna o endereço de qualquer coisa é o &amp;. Portanto, imaginemos que temos a variável x, o endereço da variável x pode ser obtido pela expressão &amp;x. Bastante simples, uh?&lt;br /&gt;Agora para termos esse endereço armazenado num ponteiro temos de, adivinhem só, declarar um ponteiro e atribuir &amp;x a esse ponteiro.&lt;br /&gt;Como se declara um ponteiro? Muito simples. Primeiro temos de saber sempre isto: Se temos uma variável int o ponteiro que aponta para essa variável tem de ser do tipo int também, se temos uma variável char o ponteiro que aponta para lá também tem de ser do tipo char e assim por diante!&lt;br /&gt;Portanto, para declarar fazemos: int *pt. É exactamente a mesma coisa que declarar uma variável normal mas põe-se o * antes. Podemos declarar uma variável "normal" e um ponteiro na mesma linha, se forem do mesmo tipo obviamente. P.e. int *pt, x = 0. Neste caso apenas &lt;span style="font-style:italic;"&gt;pt&lt;/span&gt; é um ponteiro!&lt;br /&gt;&lt;br /&gt;Então já sabemos:&lt;br /&gt;* Declarar um ponteiro&lt;br /&gt;* Obter o endereço de uma variável&lt;br /&gt;&lt;br /&gt;Sabemos também atribuir algo a algo.&lt;br /&gt;Então vamos lá fazer um pequeno código que nos "põe" dentro de um ponteiro o endereço de uma variável. Pûs no inicio do código algumas notas que achei importantes.&lt;br /&gt;&lt;a href="http://pastebin.com/LVp8L07N"&gt;Exemplo nº 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como podem ver o conteúdo de pt e o endereço de x são exactamente os mesmos, simplesmente porque atribuímos a pt o endereço de x através de: &lt;em&gt;pt = &amp;x&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;A questão agora é o que é que podemos fazer com o endereço de x. Podemos sem dúvida alterar o seu valor e trabalhar com ele com o ponteiro pt. Fazemos isto com o operador *. Quando nos referimos a *pt estamos na verdade a referir-nos ao valor de x e quando nos referimos a pt, somente, estamos na verdade a trabalhar com o endereço de x, ou seja, com o conteúdo de pt. &lt;br /&gt;Portanto, para trabalharmos com o valor de x temos de trabalhar com *pt. Vamos então alterar o valor de x através de pt.&lt;br /&gt;&lt;a href="http://pastebin.com/Bw1Ya19L"&gt;Exemplo nº 4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como podem ver neste exemplo trabalhamos várias vezes com *pt, pt e até com x e chegámos sempre ao mesmo resultado. Porquê? Simplesmente porque pt aponta para x e podemos trabalhar com x através de pt muito facilmente utilizando os operados que aprendemos até aqui.&lt;br /&gt;&lt;br /&gt;Resumindo, o operador &amp; retorna o endereço de alguma variável (e não só mas isso veremos mais para a frente). O operador * permite-nos referir ao valor da variável para qual o ponteiro aponta.&lt;br /&gt;&lt;br /&gt;Termino então aqui a primeira parte deste artigo.&lt;br /&gt;Aconselho desde já a pensarem como resolver o problema da troca de valores entre variáveis (criando um função que faz isso) e também a brincarem com todos os códigos que forneci até aqui. É de extrema importância que compreendam estes conceitos iniciais visto que vão ser usados para sempre daqui para a frente!&lt;br /&gt;&lt;br /&gt;Espero que tenham gostado e que leiam a parte 2 quando esta for publicada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-1087050384968788740?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/1087050384968788740/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/09/ponteiros-em-c-parte-1.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/1087050384968788740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/1087050384968788740'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/09/ponteiros-em-c-parte-1.html' title='Ponteiros em C - Parte 1'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-8991289866673303555</id><published>2010-09-15T12:30:00.000-07:00</published><updated>2010-09-29T12:09:23.489-07:00</updated><title type='text'>Trie</title><content type='html'>Finalmente voltei a ter tempo para voltar a escrever algo no blog.&lt;br /&gt;Hoje trago uma estrutura de dados que considero muito útil que é a Trie.&lt;br /&gt;É utilizada para armazenar strings e tem a vantagem de procurá-las muito mas mesmo muito rapidamente! &lt;br /&gt;&lt;br /&gt;Adiciona uma string em O(M) em que M é o tamanho de string e o melhor é que procura em O(M) também! Com um típico array de strings teriamos uma tempo de pesquisa O(N) em que N é a quantidade de strings, ainda teríamos mais a comparação da string que queremos procurar com a que estamos a "atravessar" no momento, mas decidi desprezar esse factor.&lt;br /&gt;&lt;br /&gt;O código está em C++ mas é facilmente "traduzido" para C (linguagem que costumo usar nestes meus posts aka artigos). &lt;br /&gt;&lt;br /&gt;Deixo também mais alguma informação sobre a mesma estrutura de dados:&lt;br /&gt;* &lt;a href="http://pt.wikipedia.org/wiki/Trie"&gt;Wikipédia&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.topcoder.com/tc?module=Static&amp;d1=tutorials&amp;d2=usingTries"&gt;TopCoder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/8tRstWDE"&gt;Trie - Código&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Este código lê as strings (1 string por cada linha) de um ficheiro chamado wordlist.in, não esquecer isto!&lt;br /&gt;&lt;br /&gt;Resumindo:&lt;br /&gt;* Tempo de inserção: O(M * N), N = Quantidade de strings (tempo total)&lt;br /&gt;* Tempo de pesquisa: O(M)&lt;br /&gt;&lt;br /&gt;Boas programações.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-8991289866673303555?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/8991289866673303555/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/09/end-false-return-1-else-return-1-void.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/8991289866673303555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/8991289866673303555'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/09/end-false-return-1-else-return-1-void.html' title='Trie'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-374024668635970662</id><published>2010-05-13T06:30:00.000-07:00</published><updated>2010-10-01T13:29:13.564-07:00</updated><title type='text'>Binary Search</title><content type='html'>Olá pessoal, hoje estou aqui para falar sobre Binary Search *AKA* Pesquisa Binária. &lt;br /&gt;&lt;br /&gt;Primeiro vamos ver em que consiste. Binary Search é um método de pesquisa mais rápido e pode ser utilizado quando temos um array ou outra estrutura de dados ordenada. Imaginemos um array de 5 elementos chamado *array* e este é o conjunto de elementos que ele contém: {1,2,3,4,5}, como podemos ver ele está ordenado. Uma maneira de pesquisar, no entanto, lenta, seria percorrer o array todo e quando o elemento actual fosse igual ao que procurámos acabava a pesquisa. Isto leva O(n) operações, onde *n* é o número de elementos que o array tem. Isto pode levar muito quando o array cresce, no entanto, com binary search podemos reduzir este tempo de pesquisa para metade. O que fazemos é consultar o elemento do meio do array e verificar se este é igual ao elemento que procurámos, se for igual então parámos a pesquisa, se não for, verificámos se é menor, se for menor isso significa que o elemento que procurámos está para a direita (no sentido figurado, como é óbvio) do array (percebem porquê?). Se for maior significa que está para a esquerda do array. Este é o conceito de binary search e vamos agora aplicá-lo já na prática, vamos criar uma função que procura por um dado elemento num array.&lt;br /&gt;&lt;a href="http://pastebin.com/rav79gQm"&gt;Código&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se fossemos medir o tempo de pesquisa iriámos perceber logo que isto é muito mais rápido do que andar a percorrer o array todo. &lt;br /&gt;Não comentei muito código porque acho que deu para perceber bem o conceito que é bastante simples de se entender. Espero que tenham gostado, até à próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-374024668635970662?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/374024668635970662/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/05/binary-search.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/374024668635970662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/374024668635970662'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/05/binary-search.html' title='Binary Search'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-7299130339538702151</id><published>2010-04-18T07:00:00.000-07:00</published><updated>2010-09-29T14:23:34.844-07:00</updated><title type='text'>Lista Ligada - Exemplo</title><content type='html'>Ora bem vou deixar aqui um exemplo de uma lista ligada com algumas funções úteis para quem está a começar a trabalhar com elas e quer exemplos.&lt;br /&gt;Qualquer dia vou fazer um tut sobre elas mas por enquanto deixo este exemplo apenas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/KfSRqKF8"&gt;Código da lista ligada&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Obvio que podiámos ter funções mais complicadas como ordenar a lista e tal mas esta é simples e só foi mesmo para vocês perceberem. Testem bem as funções, mudem, experimentem, brinquem com elas. Se encontrarem algum bug deixem comentário.&lt;br /&gt;Não comentei muito porque quem leu teoria percebe. Não é baseada em recursividade porque não gosto muito de trabalhar assim com elas. Espero que gostem. Até à próxima (:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-7299130339538702151?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/7299130339538702151/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/lista-ligada-exemplo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/7299130339538702151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/7299130339538702151'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/lista-ligada-exemplo.html' title='Lista Ligada - Exemplo'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-8225664126185576449</id><published>2010-04-17T12:45:00.000-07:00</published><updated>2010-04-17T12:54:13.276-07:00</updated><title type='text'>Olimpiadas Nacionais da Informática 2010</title><content type='html'>Bem, estamos a uma semana das ONI 2010. Esta é a primeira vez que vou participar e espero gostar.&lt;br /&gt;Tenho passado vários dias a treinar na USACO, deixo aqui o link: &lt;a href="http://train.usaco.org/usacogate"&gt;USACO&lt;/a&gt; e vou agora na secção 1.4. Tenho de dizer que é um excelente programa de treinos para quem se quer iniciar em algoritmia e para quem quer treinar bem o racicionio.&lt;br /&gt;Sobre as ONI espero que seja uma experiência muito positiva para mim e que conheça muito pessoal novo.&lt;br /&gt;Deixo aqui um link para o Portugal a Programar que é o maior forúm de programação a nível nacional: &lt;a href="http://www.portugal-a-programar.org/forum/index.php"&gt;P@P&lt;/a&gt; e também o link para o site das ONI para que se inscrevam e participem nesta aventura e quem sabe tenham a excelente oportunidade de representar Portugal nas IOI que são as Olimipiadas Internacionais da Informática que este ano vai ocorrer no Canadá.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.dcc.fc.up.pt/oni/2010/"&gt;Site das ONI 2010&lt;/a&gt;&lt;br /&gt;&lt;a href="http://train.usaco.org/usacogate"&gt;USACO&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.portugal-a-programar.org/forum/index.php"&gt;Portugal A Programar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ioi2010.org/"&gt;Site das IOI 2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Boa sorte e boas programações.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-8225664126185576449?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/8225664126185576449/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/olimpiadas-nacionais-da-informatica.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/8225664126185576449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/8225664126185576449'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/olimpiadas-nacionais-da-informatica.html' title='Olimpiadas Nacionais da Informática 2010'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-6858418527823249221</id><published>2010-04-16T16:06:00.001-07:00</published><updated>2010-09-29T12:25:56.689-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Segurança'/><title type='text'>Buffer overflow - Terrível demónio</title><content type='html'>&lt;strong&gt;O que é o buffer overflow?&lt;/strong&gt;&lt;br /&gt;Buffer overflow é o facto de se passarem os limites do buffer, o buffer é a região de memória onde são lidos e escritos dados como strings por exemplo. Como vocês sabem as strings não são mais do que vectores de elementos de 1byte, os chamados chars ou caracteres. O que o buffer overflow faz ou é, melhor dizendo, é passar os limites desse buffer atingindo assim outras zonas da memória. Agora a pergunta que fica no ar é, o que é que isso tem de perigoso e que zonas é que são "atingidas"? Vamos ver isso a seguir.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;O que é o/a stack?&lt;/strong&gt;&lt;br /&gt;O ou A, stack é o local da memória onde são guardados dados temporários como as variáveis locais, é também o que o computador utiliza para entradas e saída de dados rápidas. É também na/no stack que são guardadas as strings. O que têm de saber da/do stack é que nele/nela, quando é chamada uma função no vosso programa, é criado um stack frame (imaginem o stack frame como uma divisão do/da stack, quando temos várias funções são criados vários stack frame(s)). Ora bem, nesse stack frame vai ser onde vão ser armazenadas todas as variáveis da função e também um endereço, um endereço muito especial, o chamado, &lt;span class="bbc_u"&gt;endereço de retorno&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;O que é o endereço de retorno?&lt;/strong&gt;&lt;br /&gt;Quando chamamos uma função então é criado um stack frame, agora imaginem na vossa mente o stack frame, agora imaginem como é que no final da função o programa sabia por onde prosseguir a execução? Então para isso existe o &lt;span class="bbc_u"&gt;endereço de retorno&lt;/span&gt;, ele contêm o endereço da próxima instrução de onde foi chamada a função. Para perceberem melhor, vou pôr aqui um código:&lt;br /&gt;&lt;a href="http://pastebin.com/nS62rb6W"&gt;Exemplo 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vamos perceber o programa, declaramos uma string de 8bytes, e depois chamamos a função &lt;del&gt;gets&lt;/del&gt;, ora bem, no stack frame da função gets é criado as suas variáveis locais e também um endereço de retorno que contêm o endereço da próxima instrução do programa que neste caso é a função printf. Tentem imaginar isto como quando vamos fazer uma caminhada, pomos as pedras no caminho para não nos perdermos, digamos que a pedras são o endereço de retorno para o caminho principal.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Então como ocorre o buffer overflow?&lt;/strong&gt;&lt;br /&gt;Ora bem, quando nós passamos os limites do buffer a verdade é que tudo o que está "ao lado" dele vai entrar em contacto com os dados que passaram fora da string (no caso). Na verdade o buffer overflow é só isso, o "transboradamento", como o nome diz de dados pelo buffer fora. No entanto, ao lado do buffer muitas vezes está o endereço de retorno, e é aí que se tenta explorar, imaginem que se meta lixo até preencher o buffer e depois de se preencher, estando já em contacto com o endereço de retorno se coloque lá outro endereço, por exemplo um endereço para uma função maliciosa. Na verdade eu não estou aqui para vos explicar como explorar mas o que as pessoas mal intencionadas fazem não é meter um endereço mas sim uma coisa chamada de shellcode (procurem sobre isso no google). Para provar que é sobreescrito tudo que estiver ao lado do buffer (se forem passados os limites) compilem e executem este código:&lt;br /&gt;&lt;a href="http://pastebin.com/scd2uGe5"&gt;Exemplo 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E agora passem os limites da segunda string ou da primeira, neste caso não vamos estar em contacto com o endereço de retorno mas sim com a string que está a seguir dependendo da que quiserem, vejam então o output e tentem perceber o que aconteceu. Nota: Se estiverem em Linux vai dar um segmentation fault, não podendo assim verem o output, que é o meu caso.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Como se proteger?&lt;/strong&gt;&lt;br /&gt;Finalmente chegamos à parte da protecção, como nos podemos proteger disto tudo? É simples, usamos funções que verifiquem se a string do input é maior do que aquela que a vai receber. Vou introduzir uma lista a seguir então de funções vulneráveis e das que não são vulneráveis, relativamente a essas.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Funções - Lista (ex: Função_vulnerável - Função segura)&lt;/strong&gt;&lt;br /&gt;* gets - fgets;&lt;br /&gt;* strcpy - strncpy;&lt;br /&gt;* strcat -  strncat&lt;br /&gt;* scanf(strings) - fgets&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lista - O porquê de serem vulneráveis&lt;/strong&gt;&lt;br /&gt;* gets - A função gets, recebe um input e presupõe que o input nunca seja maior que o buffer que a vai receber.&lt;br /&gt;* strcpy - A função strcpy presupõe que a string destino tenha capacidade para comportar a string origem.&lt;br /&gt;* strcat - A função strcat presupõe que a string que a vai receber tem ainda capacidade para comportar a string que vai ser copiada&lt;br /&gt;* scanf(se não forem incluídas restrições) - A função scanf tem as mesmas caracteristicas que a gets no caso de estarmos a ler strings. Não confundam com inteiros e outro tipos de dados.&lt;br /&gt;&lt;br /&gt;Bem, estas são apenas algumas funções, muito poucas aliás mas já dá para ter uma ideia por isso sempre que utilizarem uma nova função pesquisem sobre ela.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-6858418527823249221?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/6858418527823249221/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/buffer-overflow-terrivel-demonio.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/6858418527823249221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/6858418527823249221'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/buffer-overflow-terrivel-demonio.html' title='Buffer overflow - Terrível demónio'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-759566917886277152.post-1277546159903703448</id><published>2010-04-16T16:02:00.000-07:00</published><updated>2010-04-16T16:05:12.243-07:00</updated><title type='text'>O inicio</title><content type='html'>Bem, após várias tentativas falhadas de criar um blog decidi mais uma vez tentar.&lt;br /&gt;Este blog vai cobrir basicamente o mundo da informática, especialmente a parte da programação. Os conteúdos vão ser diversos mas vão estar mais focados na linguagem de C/C++.&lt;br /&gt;Espero que gostem do conteúdo e que o visitem mais vezes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/759566917886277152-1277546159903703448?l=programmingadvt.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programmingadvt.blogspot.com/feeds/1277546159903703448/comments/default' title='Enviar comentários'/><link rel='replies' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/o-inicio.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/1277546159903703448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/759566917886277152/posts/default/1277546159903703448'/><link rel='alternate' type='text/html' href='http://programmingadvt.blogspot.com/2010/04/o-inicio.html' title='O inicio'/><author><name>Localhost</name><uri>http://www.blogger.com/profile/03150650029187425383</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
