Ceci compile dans gcc sans erreurs ou avertissements même avec l'option -Wall ce qui signifie que les limites des tableaux sont vérifiées à l'exécution et que le compilateur ne peut pas détecter l'erreurcomment les tableaux sont traités par gcc [question liée à la programmation C]
#include<stdio.h>
int main()
{
int a[2][3][4];
a[1][2][100] = 4 ;
return 0;
}
Cependant,
#include<stdio.h>
int main()
{
int a[2][3];
a[1][2][100] = 4 ;
return 0;
}
cela génère une erreur lors de la compilation comme:
$ gcc sample.c -Wall
sample.c: In function ‘main’:
sample.c:7: error: subscripted value is neither array nor pointer
Pourquoi est-ce vrai? dans les deux codes, a [1] [2] [100] est invalide. Encore comment le compilateur peut-il détecter ceci est le code2 et pas le code1.
Spécialement lorsque chaque compilateur aplatit tout tableau multidimensionnel en tableaux de dimension unique correspondants, alors comment le compilateur peut-il être sélectivement averti de cette faille dans le code.
Explication ou mention d'un certain livre ou un article où réside l'explication appropriée seront acceptés avec reconnaissance :)
Est-ce parce que int [] [] est réellement int ** et int [] [] [] est int ***? –
@SK 'int *' et 'int []' sont légèrement différents. Former implique une allocation statique (segment de données, etc.) tandis que la dernière implique une allocation dynamique (tas). – chrisaycock
Non. C'est parce que vous pouvez inscrire un int [] avec un int, mais vous ne pouvez pas inscrire un int avec un int. Si vous inscrivez un int [] [] [] avec un int, vous obtenez un int [] []. Si vous inscrivez cela avec un int, vous obtenez un int []. Si vous inscrivez cela avec un int, vous obtenez un int. Si vous inscrivez cela avec un int, vous obtenez une erreur de type. –