Changer un tableau avec une fonction en C?

Je veux appeler une fonction et je veux que cette fonction change le contenu d’une chaîne ou d’un tableau du programme en une constante.

Psuedocode:

some_array = "hello" print some_array #prints "hello" changeArray(some_array) print some_array #prints "bingo" 

Je sais que je dois passer le pointeur sur cette fonction. Voici ce que j’ai écrit

 void changeArray(char *arr){ arr = "bingo"; } int main(int argc, const char* argv[]){ char *blah = "hello"; printf("Array is %s\n",blah); changeArray(blah); printf("Array is %s\n",blah); return EXIT_SUCCESS; } 

Comment puis-je faire ceci?

Vous passez le pointeur sur le tableau par valeur plutôt que par référence. CA devrait etre:

 void changeArray(char **arr){ *arr = "bingo"; } int main(int argc, const char* argv[]){ char *blah = "hello"; printf("Array is %s\n",blah); changeArray(&blah); printf("Array is %s\n",blah); return EXIT_SUCCESS; } 

Vous avez changeArray l’adresse de “hello” à la fonction changeArray , mais vous avez modifié la valeur transmise, pas le pointeur d’origine. La modification apscope passe l’adresse du pointeur et le pointeur lui-même est modifié dans la fonction.

S’il vous plaît pas char *blah = "hello"; définit un pointeur sur une chaîne constante, ainsi que *arr = "bingo"; , c’est bien, mais si vous envisagez de changer la chaîne elle-même, vous ne pourrez pas le faire.

MODIFIER:

Lorsque vous passez un argument, même un pointeur, à une fonction, vous le copiez en un endroit où la fonction le lit (généralement la stack). Vous ne transmettez pas l’argument lui-même, mais une copie de celui-ci. Lorsque la fonction la modifie (comme dans arr = "bingo"; ), elle modifie la copie de la variable, pas la variable d’origine. Donc, afin de changer la variable elle-même, nous passons l’adresse de la variable à la fonction ( changeArray(&blah); – l’ address of- & means address of- ) et dans la fonction nous modifions la variable stockée dans l’adresse que nous avons passée ( *arr = "bingo"; – le * désigne la variable dans l’adresse arr ).

En supposant que le pointeur blah origine se trouve dans l’adresse 0x00000000 et qu’il contient l’adresse de la chaîne "hello" par exemple 0x00000010. si vous passez blah à la fonction, vous la copiez dans une nouvelle variable, arr , qui se trouve dans l’adresse 0x00000020 par exemple

 Variable Address content ------------------------------- blah 00000000 00000010 (points to hello) "hello" 00000010 "hello" (this is just an example, so don't be hard on me :) ) arr 00000020 00000010 "bingo" 00000030 "bingo" (and again...) 

maintenant, si vous modifiez le contenu de l’ arr vous modifiez la valeur dans l’adresse 0x00000020, mais pas la valeur dans l’adresse 0x000000000, de sorte que blah contient toujours 00000010.

 Variable Address content ------------------------------- blah 00000000 00000010 (points to hello) "hello" 00000010 "hello" (this is just an example, so don't be hard on me :) ) arr 00000020 00000030 (points to "bingo") "bingo" 00000030 "bingo" (and again...) 

Au lieu de cela, nous copions l’adresse de blah , qui est 0x00000000, dans arr et dans la fonction nous disons – “le contenu de arr est une adresse , accédez à cette adresse et modifiez son contenu pour qu’il pointe vers” chaîne “de bingo”. Alors maintenant, le contenu de l’adresse 0x00000000 (qui est blah ) pointe vers “bingo”.

 Variable Address content ------------------------------- blah 00000000 00000030 (points to "bingo") "hello" 00000010 "hello" (this is just an example, so don't be hard on me :) ) arr 00000020 00000000 (points to `blah`) "bingo" 00000030 "bingo" (and again...) 

J’espère que je ne vous ai pas confondu …

Il n’y a pas de tableaux dans votre code. Si vous essayez réellement de modifier le pointeur de votre pointeur de caractère bla, vous devez alors passer un pointeur à un pointeur dans la fonction. Toutefois, si vous souhaitez utiliser des tableaux, vous devez effectuer les opérations suivantes:

 void changeArray(char arr[]) { // or you can use char *arr, it's the same thing from // the C comstackr's point of view strcpy(arr, "blah"); // alternatively, you could set each element. ie arr[0] = 'b'; } int main (int argc, char** argv) { char blah[100] = "hello"; // this is an array printf("Array is %s\n", blah); changeArray(blah); // array decays to pointer printf("Array is %s\n", blah); return EXIT_SUCCESS; } 

Vous devez passer un pointeur pour mettre en tableau pas le tableau lui-même.

Autre chose: append une condition de contrôle à votre fonction. penser: que se passera-t-il si “bingo” sera plus gros que strlen (some_array)? cela vous donnera une erreur car en C vous devez le mallocer si vous avez besoin que la taille du tableau soit dynamic!