IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Indice négatif dun tableau ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut Indice négatif dun tableau ?
    Sans être très beau, c'est permis de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      int* tab = new int[4];
      int* t2 = tab + 1;
      t2[-1] = 8;
    ??

    Ca ne me met pas de warning sous vs2005.

  2. #2
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    non un indice de tableau doit bien sur être de type size_t il me semble, donc un unsigned qqchose.

    Aucun warning oO bizarre en tout cas. Segmentation fault à l'exécution au moins ?

    EDIT remarque : c'est vrai qu'avec l'arithmétique des pointeurs, t[-1] est peut-être considéré tout simplement comme *(t-1), donc valable à la compilation. tu n'as pas déclaré tes variables comme des tableaux mais comme des pointeurs, ce qui devrait expliquer l'absence de warning.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Non aucune erreur à l'éxécution, mes indices, même négatifs, vont tapper dans une zone mémoire ok, si tu regardes mon exemple.

    Bien sur faire la même chose avec un pur tableau statique, ca passe moins bien...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Sous Gcc non plus, il n'y a pas d'avertissement quant à la dangerosité de la pratique

    Je ne serais pas plus étonné que cela d'apprendre que la norme (sans doute la norme C, d'ailleurs) a laissé ce comportement "undefined", mais ne réclame pas d'avertissement...

    N'oublie pas que tab n'est jamais qu'une adresse (celle du premier élément du tableau, en l'occurence), et que le compilateur est donc parfaitement en mesure de calculer l'adresse représentée l'indice négatif.

    Maintenant, on ne peut qu'insister sur le fait que la pratique est pour le moins dangereuse

    D'ailleurs, en C++, pour ce qui est de la classe vector, la norme précise que l'indice doit etre compris entre 0 et la taille du vecteur...
    Citation Envoyé par la norme
    section 23.2.4, §1
    (...)meaning that if v is a vector<T, Allocator> where T is some type
    other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Pour un vector, cela va de soit, à peu près autant que pour les tableaux. Mais en fait je vois de moins en moins de restrictions à l'utilisation d'un indice négatif pour un pointeur. J'ai bien dans la tête des algos C qui font :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int * p = tableauALEnvers();
    while ( --count )
      *(p--) = calc();
    C'est finalement la même chose avec un indice.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je suis d'accord, c'est pas beau mais

    t2[-1]

    C'est pas égal à ?

    t2[255] ou t2[65535] ou t2[4294967295]

    suivant que l'indice est sur 1, 2 ou 4 octets.

    C'est peut être pour cela que le compilateur, il ne crie pas. Il transforme implicitement un nombre signé en non signé

    Mon idée à 2 balles
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Quand je fais un cout, j'ai bien 8 affiché donc il ne fait pas cette conversion.

  8. #8
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    pour ram_000 -> ici en fait ce n'est pas [-1] sur un tableau statique, mais sur un pointeur. Donc il faut en déduire que ptr[nombre] n'accède pas "à l'indice nombre" du tableau (qui doit etre non-signé, donc qui présente peut être le risque que tu décris), mais interpréter ça comme un simple raccourci d'écriture pour *(ptr+nombre*sizeof(type pointé)) (arithmétique des pointeurs, le nombre peut être positif ou négatif).

    Je trouve cela normal que ça ne génère pas d'erreur, et comme je vois mal le compilateur bien comprendre si la zone mémoire accédée est valide pour le programme ou non, je commence à comprendre pourquoi il ne peut pas faire de warning non plus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 26/05/2006, 17h51
  2. Réponses: 2
    Dernier message: 11/04/2006, 22h54
  3. [Tableaux] Recuperer le plus grand indice d'un tableau
    Par schnito dans le forum Langage
    Réponses: 4
    Dernier message: 31/01/2006, 20h01
  4. Réponses: 2
    Dernier message: 12/01/2006, 01h11
  5. [Tableaux] recuperation valeurs dun tableau ou d'un array
    Par pascale86 dans le forum Langage
    Réponses: 5
    Dernier message: 11/10/2005, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo