J'ai du mal à passer un tableau d'entiers comme référence, puis à modifier le tableau d'origine.

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int *i[10]){
    *i[2] = 5;
    printf("hello\n");
}

int main(){
    int i[10];
    setToFive(&i);
    // confirm i[2] == 5
    printf("%d\n", i[2]);
}

Le compilateur se plaint d'un type non valide

[vinessa@komputilo ch1]$ gcc test.c
    test.c: In function ‘setToFive’:
    test.c:5:5: error: invalid type argument of unary ‘*’ (have ‘int’)
        5 |     *i[2] = 5;
          |     ^~~~~
    test.c: In function ‘main’:
    test.c:11:15: warning: passing argument 1 of ‘setToFive’ from incompatible pointer type [-Wincompatible-pointer-types]
       11 |     setToFive(&i);
          |               ^~
          |               |
          |               int (*)[10]
    test.c:4:21: note: expected ‘int *’ but argument is of type ‘int (*)[10]’
        4 | void setToFive(int *i){
          |                ~~~~~^

Défaut de segmentation

[vinessa@komputilo ch1]$ ./a.out
Segmentation fault (core dumped)

J'ai cogné la tête au problème pendant des heures, veuillez aider.

2
12Bits 19 avril 2020 à 21:23

2 réponses

Meilleure réponse

Vous voilà

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int *i){
    i[2] = 5;
    printf("hello\n");
}

int main(){
    int i[10];
    setToFive(i);
    printf("%d\n", i[2]);
}

Si vous souhaitez modifier les éléments d'un tableau, passez-le simplement par valeur. Dans ce cas, l'indicateur de tableau est implicitement converti en pointeur vers son premier élément. En utilisant le pointeur et l'arithmétique du pointeur, vous pouvez modifier n'importe quel élément du tableau.

En fait, dans ce cas, vous passez des éléments du tableau par référence indirectement via un pointeur vers eux.

Faites attention à ce que ces déclarations de fonction

void setToFive(int i[100]);
void setToFive(int i[10]);
void setToFive(int i[1]);
void setToFive(int i[]);

Sont équivalents et déclarent la même déclaration de fonction dont le compilateur s'adapte à la déclaration suivante

void setToFive(int *i);

En conséquence, la fonction traite un pointeur.

Quant à l'expression utilisée comme argument dans cet appel de fonction

setToFive(&i);

Alors il a le type int ( * )[10] car le tableau pointé est déclaré comme

int i[10];

Ce n'est pas le même que le type du paramètre int *i[10] qui, comme je l'ai déjà écrit, est ajusté par le compilateur au type int **.

3
Vlad from Moscow 19 avril 2020 à 18:39

Vous passez un tableau de pointeurs à des entiers, pas un tableau d'entiers. Vous pouvez simplement supprimer les différentes déclarations et opérateurs *, et simplement passer un simple tableau comme argument (l'argument tableau se désintègrera en un pointeur):

#include <stdio.h>

// sets the 2 element of i to 5
void setToFive(int i[10])
{
    i[2] = 5;
    printf("hello\n");
}

int main()
{
    int i[10];
    setToFive(i);
    // confirm i[2] == 5
    printf("%d\n", i[2]);
    return 0;
}
1
Adrian Mole 19 avril 2020 à 18:28