Ben j'avais parlé d'une boucle de recherche. Bon je l'ai retapée car entre temps j'avais fait d'autres trucs mais je pense qu'elle devait ressembler à ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/types.h>
int test(char *adr, size_t i)
{
uintptr_t *pt=(uintptr_t*)adr;
return ((pt + i) > pt);
}
int main(){
char pt[10];
size_t i;
for (i=1; test(pt, i); i++);
printf("i=%lu (%x)\n", i, i);
} |
Sauf que là, je l'ai lancée plusieurs fois et voici ce que j'ai eu
Code:
1 2 3 4 5 6 7 8 9 10
| ~/tmp$ ./essai
i=269228476 (100c19bc)
~/tmp$ ./essai
i=269393864 (100e9fc8)
~/tmp$ ./essai
i=269329524 (100da474)
~/tmp$ ./essai
i=268961052 (1008051c)
~/tmp$ ./essai
i=268932548 (100795c4) |
Effectivement la valeur change à chaque appel puisque l'adresse de départ change aussi.
Oui, c'est ce que j'ai eu quand j'ai passé NULL au lieu de pt
Code:
1 2 3 4 5 6 7 8
| gcc essai.c -o essai
~/tmp$ ./essai
i=1073741824 (40000000)
~/tmp$ ./essai
i=1073741824 (40000000)
~/tmp$ ./essai
i=1073741824 (40000000)
~/tmp$ ./essai |
Et quand j'ai remplacé ">" dans le test par ">=" (ton assert), alors je n'ai plus eu de retour pour NULL (effectivement, dans ce cas le test reste toujours vrai)...