gcc -Wall -m32 -o <nome do arquivo executavel> <nome do arquivo fonte>Exemplo:
gcc -Wall -m32 -o dump1 dump1.c
A rotina abaixo faz um "dump" de uma região de memória:
#include <stdio.h> void dump (void *p, int n) { unsigned char *p1 = p; while (n--) { printf("%p - %02x\n", p1, *p1); p1++; } }O dump mostra uma sequência de posições da memória, mostrando para cada posição seu endereço e seu conteúdo (em hexa-decimal). O parâmetro
p
é o endereço inicial a ser mostrado,
e n
é o número de bytes.
Um exemplo de uso é o programa abaixo, que mostra como um inteiro é armazenado na memória:
int main (void) { int i = 10000; dump(&i, sizeof(i)); return 0; }
Explique detalhadamente o resultado do programa acima (se necessário,
rode o programa com outros valores para i
).
Aplique a mesma técnica para ver como um char
é armazenado.
Aplique a mesma técnica para ver como um short
é armazenado.
A mesma técnica pode ser usada para vermos como uma string é armazenada:
int main (void) { char p[] = "7509"; dump(p, sizeof(p)); return 0; }Modifique o exemplo acima para descobrir os códigos ASCII dos caracteres
'a'
,
' '
,
'\n'
,
e '$'
.
#include <ctype.h> #include <stdio.h> int string2num (char *s) { int a = 0; for (; *s; s++) a = a*10 + (*s - '0'); return a; } int main (void) { printf("==> %d\n", string2num("1234")); printf("==> %d\n", string2num("1234") + 1); printf("==> %d\n", string2num("1234") + string2num("1")); return 0; }
string2num
.
Mande imprimir o valor de *s
e de a
a cada iteração
do for
, ambos com %d. O que está acontecendo?
O que será o valor de (*s - '0')
a
cada iteração?
string2num
do exercício anterior
para converter strings contendo numerais escritos em qualquer base
entre 2 e 10.
A base em que o numeral está escrito
deverá ser dada como um segundo parâmetro (do tipo int
)
para a função.
Teste sua função com as chamadas abaixo:
printf("%d\n", string2num("777", 8)); printf("%d\n", string2num("777", 10));
string2num
para aceitar
bases maiores que 10.
Nesse caso, precisamos de "dígitos" para os valores a partir de 10.
Use as letras a-z
para isso, com a
representando o "dígito" 10
e assim por diante, até z
representando o "dígito" 35.
(Qual a maior base que podemos usar com esse esquema?)
Teste sua função com as chamadas abaixo:
printf("%d\n", string2num("1a", 16)); printf("%d\n", string2num("a09b", 16)); printf("%d\n", string2num("z09b", 36));(Dica: talvez as funções
isdigit
e isalpha
possam ser úteis.
Use o comando man
para ver a sua descrição.)