Declaration d'un pointeur

Fermé
dali - 12 avril 2005 à 10:23
 dali81 - 13 avril 2005 à 09:32
onjour tout le monde,

j'ai écrit un code qui permet de generer un vecteur aleatoire d'entiers entre 1 et 10, mais ça fonctionne pas je pense a cause de la declaration du pointeur :

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>



int main(int argc, char *argv[])
{

int i,buffer,position;
int *p;
*p=0;

for(i=0;i<10;i++)
{
*(p+i)=i+1;
}

for(i=0;i<10;i++)
{
position=random()%10;
buffer=*(p+i);
*(p+i)=*(p+position);
*(p+position)=buffer;
}

for(i=0;i<10;i++)
printf("%i ", *(p+i));

return EXIT_SUCCESS;
}

2 réponses

Oui c'est normal...

int *p;

Là tu dis que p est un pointeur. Mais un pointeur sur quoi ? Qu'est-ce qu'une flèche sans cible ???

Bref, il faut que le pointeur pointe vers une zone mémoire. Pas trop le choix, deux solutions.
- Soit c'est un pointeur qui sert à manipuler une zone mémoire existante (ex : j'ai un pointeur qui pointe en début de liste, et je veux me balader dans la liste sans perdre l'origine).

- Soit c'est un pointeur qui est destiné à gérer une nouvelle zone mémoire à par entière, l'exemple de ton tableau de 10 éléments est parfais.

Dans le deuxième cas, il faut que tu demande au système un bout de mémoire.
Celà se fait par la fonction malloc().

Tu veux 10 éléments, ses éléments sont des entier ?
Alors il faut que tu réserve, auprès du système, un bloc mémoire de 10 fois la taille d'un entier.
En C, on écrit :
malloc( 10 * sizeof(int) );

Et les choses sont bien faites puisque malloc te renvoit un pointeur, qui pointe vers la zone mémoire alloué.

il faut donc écrire

int *p = malloc( 10*sizeof(int) );

Et AINSI p pointe vers un tableau de 10 éléments entiers.

OK ? Si il n'y a pas d'autre erreur, ton code devrais rouler comme ça.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
13 avril 2005 à 08:55
int *p = (int*)malloc(10*sizeof(int))


++
0
merciiiiiiiiiiiiii;

ça marche, je connaissais pas cette commande
0