salut,
Envoyé par
Sve@r
T'as tout à fait le droit d'écrire int *PE=97767
oui évidement, mais l'expression donnée est printf("%d\n", (PE = 97767, K = PE / 10, --PE - --K % 9407));, si on la conserve telle qu'elle est donnée dans l’énoncé le compilateur lèvera une erreur :
error: invalid operands to binary / (have int * and int)
et si on effectue le changement jusqu'au bout ça compilera bien mais on aura un warning pour nous signaler que le pointeur n'a pas été initialisé, et génèrera un code machine dans lequel il essaye de faire rentrer une valeur dans l'adresse pointée par un registre qui vaut zéro, ce qui va segfault (bien avant la division donc)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| int *PE;
int K;
printf("%d\n", (*PE = 97767, K = *PE / 10, --*PE - --K % 9407));
---------------------------------------------------------------------------
warning: PE is used uninitialized in this function [-Wuninitialized]
---------------------------------------------------------------------------
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400539 in main ()
(gdb) info registers rax
rax 0x0 0
(gdb) disassemble main
Dump of assembler code for function main:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: sub $0x10,%rsp
0x0000000000400535 <+8>: mov -0x8(%rbp),%rax
=> 0x0000000000400539 <+12>: movl $0x17de7,(%rax) // "int *PE = 97767;"
0x000000000040053f <+18>: mov -0x8(%rbp),%rax |
Envoyé par
Sve@r
Attention, il n'y a pas d'affectation. Mais ça ne change rien au résultat
ni au code machine généré, c'est rigoureusement le même ^^
Partager