Changement de tableau à l'intérieur de la fonction en C
Je suis en train d'apprendre le C et confus pourquoi un tableau créé dans les principaux habitude de changement à l'intérieur de la fonction, je suis en supposant que le tableau passé est un pointeur, et la modification du pointeur devraient ai changer le tableau , à droite ? quelqu'un peut m'expliquer ce qui se passe dans ce cas?
thx pour l'aider.
int main(){
int i, length = 10;
int array[length];
for (i = 0 ; i < length ; i++)
array[i] = i * 10;
printf("Before:");
print(array, length);
change(array, length);
printf("After:");
print(array, length);
return 0;
}
//Print on console the array of int
void print(int *array,int length)
{
int i;
for(i = 0 ; i < length ; i++)
printf("%d ", array[i]);
printf("\n");
}
//Change the pointer of the array
void change(int *array,int length)
{
int *new = (int *) malloc(length * sizeof(int));
int i;
for(i = 0 ; i < length ; i++)
new[i] = 1;
array = new;
}
J'attend de voir la sortie suivante:
Before:0 10 20 30 40 50 60 70 80 90
After:1 1 1 1 1 1 1 1 1 1
Ce que je reçois:
Before:0 10 20 30 40 50 60 70 80 90
After:0 10 20 30 40 50 60 70 80 90
- ses juste pour le test
- Jamais, pas même pour le test.
- u peut donner des conseils alors? thx
- Tableau est une variable locale à l'intérieur des deux
main
etchange
. Son adresse est passé demain
àchange
. Après cela,change
pouvez la redistribuer et elle n'aura aucun effet sur le tableau dansmain
. Les deux variables sont indépendantes. Maintenant,change
peut changer le contenu dearray
, auquel casmain
verrez le changement. - Viens voir ma réponse, et vous comprendrez ce que je veux dire. Pour les compilateurs
for(int i=0;i<length;i++)
est parfaitement lisible mais pour les humains ... C'est mieux quefor (int i = 0 ; i < length ; i++)
. Aussi, l'écriture de plusieurs instructions sur la même ligne rend encore plus difficile à lire. - Ne pas utiliser malloc pour une telle tâche. Essayez ceci.
- Est une bonne habitude d'utiliser "const" chaque fois que vous voulez une fonction à ne pas modifier quelque chose. Donc, juste pour s'assurer que vous êtes réellement l'impression et de ne pas essayer de modifier le tableau à l'intérieur de la fonction d'impression que vous devriez changer votre fonction d'impression pour annuler l'impression(const int *tableau, int longueur){..}.
- Je suis confus pourquoi
void f(int i) {i = 5;} int main() {int x = 0; f(x); printf("%d\n", x); return 0;}
ne pas imprimer sur 5? N'ai-je pas changer de x à l'intérieur de la fonction?
Vous devez vous connecter pour publier un commentaire.
Dans c vous ne pouvez pas passer une variable par référence, la
array
variable que vous attribuez à l'intérieur de la fonction contient initialement la même adresse que le pointeur passé, mais c'est une copie de celui-ci afin de le modifier ne pas modifier le passé pointeur.Vous avez besoin de passer l'adresse du pointeur de la souris afin d'être en mesure de le modifier, à l'instar de ce
Puis dans
main()
vous ne pouvez pas affecter à un tableau, de le faire par le biais de ce genre de fonction est sûrement un comportement indéfini. Le tableau défini dansmain()
est alloué sur la pile, et vous ne pouvez pas affecter quoi que ce soit à un tableau, car ils sont non-inscriptible lvalues de sorte que vous ne peut pas le faire pointer vers un segment de mémoire emplacement obtenus avecmalloc()
, vous avez besoin pour passer un pointeur comme ceSi vous voulez que la fonction remplacer le tableau précédent, il devra
free()
lamalloc()
ed de données (remarque que le passageNULL
àfree()
est bien défini), de sortepuis dans
main()
à faire ce que vous apparemment le souhaitez.
Vous passez un pointeur vers le tableau
array
à la fonctionchange
. Dans cette fonction, vous pouvez créer un autre tableau appelénew
(à l'aide denew
comme un nom est une mauvaise idée), puis l'affecter à la créés localement les paramètres de la fonctionarray
. Vous ne pas modifier le pointeur de votremain
fonction. Si vous souhaitez faire, vous devez utiliserdans votre fonction principale et
dans votre
change
fonction.Votre tableau principal est un tableau. Il se désintègre à un pointeur, pour produire le comportement que vous attendez, mais il est pas un pointeur.
Ce que votre code est en train de faire est de copier l'adresse d'une fonction de variable locale. La modification, il aura plus aucune différence à l'extérieur de la modification de la longueur.
Si vous souhaitez modifier un pointeur de l'appelant, vous aurez besoin d'utiliser de pointeur vers le pointeur de la syntaxe:
Cependant: Il y a un problème avec ce que vous essayez de faire qui va au plus profond que cela.
Dans votre code, "int a" est un tableau sur la pile, pas un pointeur alloué; vous ne pouvez pas, et vous devriez éviter de mélanger des tas/pile pointeurs de cette façon parce que vous finirez gratuit la mauvaise chose.
À utiliser le passage par valeur:
Effectuez les modifications suivantes:
En fonction
change(...)
, remplacer:À:
MODIFIER:
Mais pour utiliser le passage par référence:
Puis, en principal, apportez les modifications suivantes, et il fonctionnera comme vous le dessein:
ainsi, lorsque vous passer le tableau, vous obtenez l'adresse de début:
mémoire adresse
|-junk-| 1000
|---0---| 1008 <- début de votre tableau
|---10--| 1012
. .
. .
lorsque vous obtenez le pointeur dans ta fonction, sa valeur est 1008(exemple) afin de changer cela signifie seulement vous maintenant point à un autre endroit. ce n'est pas ce que vous voulez.
vous pouvez modifier les entiers pointé directement par l'opérateur*, donc
*array = 99;
va changer le premier élément,*(array+1) = 98;
la deuxième et ainsi de suite.vous pouvez aussi, plus naturellement utiliser l'opérateur [].
donc, dans votre fonction
array[0] = 99;
va effectivement changer le tableau d'origine.