Pointeur de pointeur

Résolu
kenson72000 Messages postés 5 Statut Membre -  
kenson72000 Messages postés 5 Statut Membre -
Bonjour, s'il vous plaît j'aimerai savoir quel est le problème. Le code ci-dessous n'indique aucune erreur mais ça plante lors de l'exécution du programme.

main()
{
int i,j,n;

int **a;

printf("\tEntrer la dimension de votre matrice: ");

scanf("%d",&n);

for(i=0;i<n;i++)

{
a[i]=malloc(n*sizeof(int));

}

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("\tEntrer les elements de la ligne %d et de la colonne %d: ",i,j);
scanf("%d",&a[i][j]);
}
}

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{

printf("\tVoici l' element de la ligne %d et de la colonne %d %d: ",i,j, a[i][j]);

}
}

}

3 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Avant de faire a[i]=malloc(n*sizeof(int)); il faudrait que a[i] existe, et donc que tu fasses d'abord un malloc sur le a :

    a = malloc(n*sizeof(int*)); 
    2
    1. kenson72000 Messages postés 5 Statut Membre
       
      merçi KX tu es trop fort l'instruction a = malloc(n*sizeof(int*)); a débloqué tt le pb. Merçi encore
      0
  2. kratosmindfreak Messages postés 45 Statut Membre
     
    a la place de" int **a " tu peut seulement utiliser un pointeur "int *a" puis pour allouer dynamiquement tu vas juste taper: a=(int*)malloc(n*n*sizeof(int))
    -1
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Dans ce cas il faut changer tous les a[i][j] en a[n*i+j]
      0
    2. kenson72000 Messages postés 5 Statut Membre
       
      la signature de la fonction m'a été imposée c'est pour cela que j'utilise int **a.
      0
    3. kratosmindfreak Messages postés 45 Statut Membre
       
      changer a[i][j] ->>>> *(a+i*n+j)
      0
    4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Oui. Mais kenson72000 vient de dire que int **a était imposé ^^.
      Il faut donc bien qu'il alloue a=malloc(n*sizeof(int*)); comme dit par KX.
      0
  3. kratosmindfreak Messages postés 45 Statut Membre
     
    donc il faut faire:
    int **a;
    a=(int **) malloc(n*sizeof((int*));

    for (i=0; i<n; i++)
    a[i]=(int *) malloc(n*sizeof(int));
    -1
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Oui c'est ce que dit KX.
      Sauf qu'il a mis sizeof(int*) au lieu de sizeof(double*). Techniquement c'est pareil, mais je ne vois pas l'intérêt de mettre du double* quand il est question de int...
      De plus, le cast est superflu : conversion automatique de void*.
      0
    2. kratosmindfreak Messages postés 45 Statut Membre
       
      dsl j'ai oublier de mettre int a la place de double :)
      0
    3. kratosmindfreak Messages postés 45 Statut Membre
       
      le cast ca depend de compilateur par exemple Dev c++ necessite un cast
      0
    4. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Non ça ne dépend pas du compilateur !
      Le cast n'est pas obligatoire en C conformément à la norme ISO C89/90.
      Si ton compilateur crie, c'est qu'il est en mode C++...
      0
    5. KX Messages postés 19031 Statut Modérateur 3 020
       
      "Dev c++ necessite un cast" parce que c'est du C++ ici on parle de C
      0