Envoyé par
keil
ok, je vais t'expliquer en quelques mot.
Quand tu programme en C, il faut toujours que tu visualises la mémoire et que tu sache toujours qu'un tableau c'est avant tout un pointeur particulier.
int tab[3][5] signifie que tu crées un pointeur de nom tab et que tu lui alloues 3*5*sizeof(int) octets en lecture/écriture en mémoire.
donc, tu seras capable d'écrire en mémoire sur 60 octets en supposant qu'un int soit codé sur 4 octets.
quand tu demande
tab[1][1] = 5; //une assignation toute bete.
tu demande d'écrire en memoire le nombre 5, 1*5+1 case après le début de ton tableau, soit 24 octets après l'emplacement mémoire sur lequel tab pointe.
quand tu demande:
tab[3][5] = 5;
tu demande d'écrire en mémoire le nombre 5, 3*5+5 cases après le début de ton tableau, soit 120 octets après l'emplacement mémoire sur lequel tab pointe.
en gros, si l'adresse mémoire sur lequel tab pointe est 78 en format décimal, tu lui demande décrire sur la portion 198->201 l'entier 5 (toujours codé sur 4 octets)
hors ton tableau occupe l'espace 78->138, tu te rends donc compte que tu tentes d'écrire en dehors de l'espace réservé à ton tableau.
En java, tu auras eu l'exception bounds out of limit, en C, tu aurais du avoir un segmentation fault.
le problème avec le C, c'est que la plupart des compilos ne sont pas ausi stricts que celui de java. donc ils ne verifient pas les erreurs de ce genre.
(Cela permet à beaucoup de hacker d'exercer le buffer overflow)
tu fais des accès hors limites d'une zone définie, normalement c'est accès interdit, mais des programmes utilisant la mémoire partagée te permettent de lire voire écrire dans ces zones.
Si tes autres progs marche, c'est parce que ton tableau est défini en mémoire juste avant une des zones de ce type. t'as eu du bol que ça ait marché, mais normalement ca devrait pas! (tente de un printf("%s\n", NULL); tu verras que ca fonctionnera pas)
ce que je t'ai fait faire, c'est juste définir une taille plus grande pour que une partie de ton code reste cohérent et ait bien droit aux acces lecture/écriture dans la zone de ton tableau.
c'est pour ca que ca marche.
bref!
Le premier indice d'un tableau en C est 0 (et non pas 1 comme en algorithmique).
Quand tu utilises un langage, fait attention aux normes.
le C étant très permissif, tu tomberas souvent sur des erreurs de ce genre.
En C, il faut etre rigoureux et precis sur le code que tu établis!!
Partager