2017-10-11 4 views
1

j'ai essayé le code suivantpointeur sur un tableau 2D avec une longueur de ligne incompatible

char arr[5] = {'A', 'E', 'I', 'O', 'U'}; 
    char (*p_arr)[1] = &arr; 
    printf("%c\n", p_arr[0][4]); //returns 'U' 

Pourquoi pas là une erreur, car

char (*p_arr)[1] = &arr; 

semble être une initialisation à partir d'un type incompatible (char (*)[5] au lieu de requis char (*)[1])? De plus, p_arr[0][4] demande le 5ème élément d'un tableau censé avoir seulement 1 élément. N'est-ce pas mal?

+0

Etes-vous sûr que les builds? Les types de 'p_arr' et' & arr' sont différents, cette initialisation ne devrait pas être autorisée. –

+2

Quant à ce que je pense que votre question est, C n'a aucune vérification des limites. –

+0

Par _ "C ne contrôle pas les limites" _ Voulez-vous dire que le compilateur C n'utilise pas les informations '[1]' dans 'char (* p_arr) [1] = &arr;'. Si tel est le cas, n'y a-t-il pas un problème avec l'allocation de mémoire statique de C? –

Répondre

0

Votre compilateur est cassé/mal configuré/non conforme.

Un pointeur de tableau vers un tableau avec 1 élément n'est pas compatible avec un pointeur de tableau vers un tableau de 5 éléments. La règle de simple affectation en C dit qu'une affectation de pointeur valide doit être (C11 6.5.16.1 Souligné par l'auteur):

  • l'opérande gauche est de type pointeur atomique, qualifié ou non qualifié, et (en tenant compte le type que l'opérande gauche aurait après conversion de lvalue ) les deux opérandes sont des pointeurs vers des versions qualifiées ou non qualifiées de types compatibles, et le type pointé vers la gauche a tous les qualificatifs du type pointé par le droit;

Si nous enlevons tous les termes standards formels du texte cité, nous nous retrouvons avec ce en anglais simple:

L'opérande gauche de l'opérateur = est de type pointeur, et les deux opérandes sont pointeurs vers des types compatibles.

Ce n'est pas le cas dans votre code, il contient quelque chose appelé violation de contrainte, ce qui signifie que le code viole ce qui est autorisé par la norme C.

+0

A droite, j'ai oublié que le compilateur C ne vérifie pas bornes pour la partie 'p_arr [0] [4]'. –

+0

Avez-vous essayé d'exécuter la partie 'char (* p_arr) [1] = &arr;' du code? J'ai téléchargé codeblocks IDE sur leur site web, êtes-vous sûr que mon compilateur est cassé/non-conforme? –

+0

@ Y.GP Après l'avoir testé moi-même, le compilateur émet un * avertissement * sur les types incompatibles pour l'assignation. Mais vous devez vous rappeler que C est plutôt faiblement typé, ce qui est probablement la raison pour laquelle ce n'est pas une erreur. –