Conteúdos avançados sobre ponteiros [RESOLVIDO]

1. Conteúdos avançados sobre ponteiros [RESOLVIDO]

Gabriel Oliveira da Silva
Gabrielz

(usa Arch Linux)

Enviado em 23/10/2015 - 22:13h

Certamente quando penso em C, penso em ponteiros! Muitos projetos em C utilizam ponteiros, GTK+, Qt, tudo que os senhores imaginarem.

Infelizmente, só sei usar ponteiros pra passagem por referência :(. Será que os senhores poderiam me ensinar técnicas avançadas usando ponteiros? Técnicas que podem "lascar" a memória RAM? Técnicas pra mexer no endereço de memória do kernel e alterar valores (quando tem tela azul no Windows, sempre aparece o endereço de memória da falha!)?


  


2. MELHOR RESPOSTA

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 23/10/2015 - 22:26h

Gabrielz escreveu:

Certamente quando penso em C, penso em ponteiros! Muitos projetos em C utilizam ponteiros, GTK+, Qt, tudo que os senhores imaginarem.

Infelizmente, só sei usar ponteiros pra passagem por referência :(. Será que os senhores poderiam me ensinar técnicas avançadas usando ponteiros? Técnicas que podem "lascar" a memória RAM? Técnicas pra mexer no endereço de memória do kernel e alterar valores?


Olá amigo :D

Bom, se vc tentar acessar algum endereço de memória que algum outro programa esteja utilizando, ou o kernel, por exemplo, irá dar Falha de segmentação.

Um exemplo:



#include <stdio.h>

int main(int argc, char *argv[]){

int *vaco;

vaco = 5; // Posicao do ponteiro bem no inicio da RAM !! ERRRO!
//vaco = (int *)5; O 'correto' para nao dar warnings...

*vaco = 10;

printf("Vaco %d %p\n",*vaco,vaco);

return 0;
}



Direto do Wikipédia:


[...] Na maioria das arquiteturas, um ponteiro é grande o suficiente para indexar todas as unidades de memória presentes no sistema. Isso torna possível a um programa tentar acessar um endereço que corresponde a uma área inválida ou desautorizada da memória, o que é chamado de falha de segmentação. Por outro lado, alguns sistemas possuem mais unidades de memória que endereços. Nesse caso, é utilizado um esquema mais complexo para acessar diferentes regiões da memória, como o de segmentação ou paginação. [...]


Agora algumas utilidades dos ponteiros:

* Permite passagem por referência (passa o endereço dos dados ao invés de uma cópia dos mesmos), muito utilizado na passagem e retorno de valores de funções
* Alocação dinâmica de memória (talvez o mais importante);
* Strings (relacionado com o item anterior);
* Criação de estruturas de dados como listas encadeadas e árvores;
* Em programação de mais baixo nível, como em drivers, sem ponteiros você não sai do lugar.
Entre outros...

Esse livro tem 500 páginas dedicadas apenas a ponteiros, dada sua importância:
http://www.amazon.com/Understanding-Pointers-C-Yashavant-Kanetkar/dp/8176563587 

Leitura bem interessante, por sinal.

E se quiser algumas informações, o site do Wikipédia é completinho até:

https://pt.wikipedia.org/wiki/Ponteiro_%28programa%C3%A7%C3%A3o%29 


Espero ter ajudado

Se ajudei, marque o tópico como resolvido e clique em melhor resposta!

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"



3. Re: Conteúdos avançados sobre ponteiros [RESOLVIDO]

Gabriel Oliveira da Silva
Gabrielz

(usa Arch Linux)

Enviado em 23/10/2015 - 22:32h

Thihup escreveu:

Gabrielz escreveu:

Certamente quando penso em C, penso em ponteiros! Muitos projetos em C utilizam ponteiros, GTK+, Qt, tudo que os senhores imaginarem.

Infelizmente, só sei usar ponteiros pra passagem por referência :(. Será que os senhores poderiam me ensinar técnicas avançadas usando ponteiros? Técnicas que podem "lascar" a memória RAM? Técnicas pra mexer no endereço de memória do kernel e alterar valores?


Olá amigo :D

Bom, se vc tentar acessar algum endereço de memória que algum outro programa esteja utilizando, ou o kernel, por exemplo, irá dar Falha de segmentação.

Um exemplo:



#include <stdio.h>

int main(int argc, char *argv[]){

int *vaco;

vaco = 5; // Posicao do ponteiro bem no inicio da RAM !! ERRRO!
//vaco = (int *)5; O 'correto' para nao dar warnings...

*vaco = 10;

printf("Vaco %d %p\n",*vaco,vaco);

return 0;
}



Direto do Wikipédia:


[...] Na maioria das arquiteturas, um ponteiro é grande o suficiente para indexar todas as unidades de memória presentes no sistema. Isso torna possível a um programa tentar acessar um endereço que corresponde a uma área inválida ou desautorizada da memória, o que é chamado de falha de segmentação. Por outro lado, alguns sistemas possuem mais unidades de memória que endereços. Nesse caso, é utilizado um esquema mais complexo para acessar diferentes regiões da memória, como o de segmentação ou paginação. [...]


Agora algumas utilidades dos ponteiros:

* Permite passagem por referência (passa o endereço dos dados ao invés de uma cópia dos mesmos), muito utilizado na passagem e retorno de valores de funções
* Alocação dinâmica de memória (talvez o mais importante);
* Strings (relacionado com o item anterior);
* Criação de estruturas de dados como listas encadeadas e árvores;
* Em programação de mais baixo nível, como em drivers, sem ponteiros você não sai do lugar.
Entre outros...

Esse livro tem 500 páginas dedicadas apenas a ponteiros, dada sua importância:
http://www.amazon.com/Understanding-Pointers-C-Yashavant-Kanetkar/dp/8176563587 

Leitura bem interessante, por sinal.

E se quiser algumas informações, o site do Wikipédia é completinho até:

https://pt.wikipedia.org/wiki/Ponteiro_%28programa%C3%A7%C3%A3o%29 


Espero ter ajudado

Se ajudei, marque o tópico como resolvido e clique em melhor resposta!

[]'s

T+

--

body@human: $ sudo su
brain@human: # apt-get purge -y windows* && echo "Windows removed successfully"



Esta resposta (endereço de memória 6333025) deste tópico (endereço de memória 152551) acaba de receber a função melhor_resposta(&resposta, &topico).

Meu sonho é desenvolver drivers, maaaaaaaaaas... vai demorar muito -qq









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts