• STATISTIQUES
  • Il y a eu un total de 3 membres et 6288 visiteurs sur le site dans les dernières 24h pour un total de 6 291 personnes!


    Membres: 2 608
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] PHP France
    Pour tout savoir sur le PHP, en français. Vous trouverez des tutoriels, des exemples, des astuces, toute la do...
    Hacking
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] social-engineer
    Site dédié au Social Engineering en général.
    Hacking
    [EN] Framework Metasploit
    Le Framework Metasploit est un logiciel gratuit, open source de tests de pénétration développ&ea...
    Vulnérabilités
    [FR] PHP Débutant
    Apprendre le PHP par l'exemple, facilement et simplement. Réservé d'abord aux débutants....
    Programmation
    [EN] Astalavista
    JavaScript: 1, Exploit: 2, Crypto: 34, CrackIt: 15, Stegano: 8, Programming: 12, Logic: 36, Special: 6, Science: 4, Info...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C TOTW 2] Parcours de tableau
01-09-2014, 10h42 (Modification du message : 15-09-2014, 13h44 par ark.)
Message : #1
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
[C TOTW 2] Parcours de tableau
Hello all,

nouveau tip of the week, aujourd'hui, je vous propose un petit truc pratique avec les pointeurs.

imaginons un tableau de données, comme suit :

Code C :

int arr[] = {7, 4, 6, 8, 6, 5, 2, 0, 6, 7, 6, 1, 6, 0xd, 6, 5};
 


si on veut parcourir tous les éléments de ce tableau, on va pouvoir utiliser la très classique méthode a coup de sizeof :

Code C :

for (i = 0 ; i < (sizeof(arr) / sizeof(arr[0])) ; ++i) {
    printf("%d", arr[i]);
}
 


Mais si on réfléchit un peu, arr est un tableau, on connait donc son adresse. Ce qu'il faut savoir avec les tableaux, c'est que leur taille est celle totale des tailles des éléments. c'est pourquoi on peut faire le truc avec le sizeof. Mais du coup, &arr + 1, pointe vers la fin du tableau !

Ce qui veut dire que (&arr + 1) - &arr == sizeof(arr) !! Et c'est assez pratique parce que pour le coup, on va pouvoir utiliser directement un pointeur du bon type pour parcourir notre tableau aisément !

Code C :

int *p;

for (p = arr; p < *(&arr + 1) ; ++p) {
    printf("%d", *p);
}
 


A noter aussi que *(&arr + 1) peut s'ecrire aussi: (&arg)[1] mais aussi encore 1[&arg]

Ce qui au final peut donner :
Code C :

for (p = arr; p < 1[&arr] ; ++p) {
    printf("%d", *p);
}
 
+1 (9) -1 (0) Répondre
22-09-2014, 13h54 (Modification du message : 22-09-2014, 14h00 par crown.)
Message : #2
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C TOTW 2] Parcours de tableau
Juste pour être sûr d'avoir bien compris (je garde la même structure que ton tableau), on prend le cas où &arr = 0x0028FECC, (&arr + 1) = 0x0028FF0C car en mémoire 64 octets sont réservés, la mémoire étant donc déjà utilisée dans cette espace, on chope l'adresse la 1ere adresse mémoire de libre après celle occupé par le tableau ?

Du coup la condition de ta boucle for peut s'écrire de la façon suivante :

Code C :

int arr[] = {7, 4, 6, 8, 6, 5, 2, 0, 6, 7, 6, 1, 6, 0xd, 6, 5};

    int * ptr;

    for (ptr = arr; ptr < (&arr + 1) ; ptr ++) {
        printf("val : %d at %p\n", *ptr, ptr);
    }
 
+1 (0) -1 (0) Répondre
22-09-2014, 13h57
Message : #3
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [C TOTW 2] Parcours de tableau
Oui, c'est bien ça =)
+1 (0) -1 (0) Répondre
29-09-2014, 12h46 (Modification du message : 29-09-2014, 13h04 par crown.)
Message : #4
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C TOTW 2] Parcours de tableau
Du coup j'ai une autre question, en faisant &arr[1] on chope l'adresse du deuxième élément du tableau, mais en quoi est-ce différent de (&arr)[1] ?

[EDIT] : Du coup j'ai trouvé, pour ceux que ça intéresserait : http://arjunsreedharan.org/post/69303442...-find-size

[EDIT#2] : Bon apparemment les pointeurs et moi c'est pas trop ça :

Code C :

#include <stdio.h>

void listTbl(int *tab)
{
    int* ptr;

    for(ptr = tab ; ptr < (&tab)[1]; ptr++)
    {
        printf("%d\n", *ptr);
    }
}

int main(void)
{
    int tbl[] = {1, 15 ,12 ,20 ,352 ,15};

    listTbl(tbl);

    return 0;
}
 


Ici ça ne me liste pas mon tableau et je vois pas pourquoi, si vous avez une idée è_é ?

[EDIT#3] : Finalement j'ai testé 2/3 trucs et le code ci dessous marche en revanche je sais pas pourquoi :/

Code C :

#include <stdio.h>

void listTbl(int *tab)
{
    int* ptr;

    for(ptr = tab ; ptr < (&tab + 12); ptr++)
    {
        printf("%d at 0x%p\n", *ptr,ptr);
    }
}

int main(void)
{
    int tbl[6] = {1, 15 ,12 ,20 ,352 ,15};

    listTbl(tbl);

    return 0;
}
 
+1 (1) -1 (0) Répondre
29-09-2014, 12h47 (Modification du message : 29-09-2014, 13h09 par EpicOut.)
Message : #5
EpicOut Hors ligne
Membre actif
*



Messages : 121
Sujets : 10
Points: 22
Inscription : Feb 2012
RE: [C TOTW 2] Parcours de tableau
il vient d'où ton "(&arr)[1]" ? ce serait plutôt (&tab)[1]

Ca donnerait plus un truc comme ça:

Code C :
#include <stdio.h>

void listTbl(int *tab, int len)
{
    int* ptr;

    for(ptr = tab ; ptr <= (&tab[len -1]); ++ptr)
    {
        printf("%d\n", *ptr);
    }
}

int main(void)
{
    int tbl[] = {1, 15 ,12 ,20 ,352 ,15};

    listTbl(tbl,6);

    return 0;
}

 
Plein de mouches peuvent rentrer en boucle close.
[Image: vQs9wRu.png]
+1 (0) -1 (0) Répondre
29-09-2014, 17h44 (Modification du message : 29-09-2014, 17h44 par crown.)
Message : #6
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C TOTW 2] Parcours de tableau
Autant pour moi le (&arr)[1] c'est une erreur d’inattention dans le code que je compile je mets bien &tab mais ça me donne le même résultat (càd rien).

Du coup oui (&tab[5]) marche mieux en effet, bon en l'occurence c'est (&tab[6]) pour afficher toutes les valeurs.

Par contre (&tab[6]) == (tab + 6) (ici je vois bien pourquoi c'est deux expressions ce valent) mais pour (&tab + 12) je vois pas en quoi cette expression est interprétée comme les deux précédentes.

[EDIT] : Je pense avoir un début d'explication pour (&tab + 12) qui correspond à (&tab[6]), dîtes moi si je me trompe : on prend &tab = 0028FEE0 et (&tab + 12) = 0028FF10, on a donc 0x0028FF10 - 0x0028FEE0 = 0x30 soit 48 en décimal, en sachant que sizeof(*ptr) = 4, on a 48 / 4 = 12, ici on retrouve le 12 mais à partir de là je vois toujours pas pourquoi ça correspond. Ce qui est assez déroutant c'est que tab devrait être égal à &tab en ce qui concerne l'adresse, helas non dans la fonction, tab = 0028FEF8 et &tab = 0028FEE0 soit 24(d) de moins (ce qui correspondrait au tableau de 6 int ?, un int étant de 4 octets). Si vous avez des suggestions pour expliquer ça ? ; je suis preneur.
+1 (0) -1 (0) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  [C TOTW 6] Xor tricks ark 7 478 06-03-2016, 23h36
Dernier message: Commodor
  [C] Initialiser un tableau notfound 2 324 28-08-2015, 11h01
Dernier message: eax64
  [C TOTW 5] bitfields ! ark 4 232 23-09-2014, 11h17
Dernier message: Aniem
  [C TOTW 4] Equivalent de try / catch / throw en C ark 0 147 15-09-2014, 10h00
Dernier message: ark
  [C TOTW 3] #warning, #error ark 1 178 10-09-2014, 11h49
Dernier message: ark
  [C TOTW 1] Trick avec #include ark 10 469 01-09-2014, 18h23
Dernier message: Commodor
  [C] Parcours récursif des dossiers InstinctHack 12 469 22-04-2013, 11h20
Dernier message: sakiir
  [C] question tableau InFamouZz 8 403 20-03-2013, 19h19
Dernier message: sakiir
  [C++] Parcours de dossier récursif Dobry 2 134 04-03-2012, 11h13
Dernier message: Dobry

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut