Manipulation d’un tableau dynamic via des fonctions en C

J’apprends à utiliser des tableaux dynamics en C. Ce que je veux faire, c’est créer des data tableau dynamic et mettre “1” dans la première entrée à l’aide de la fonction test() .

 void test(void) { data[0] = 1; } int main(void) { int *data = malloc(4 * sizeof *data); test(); return 0; } 

Cela comstack dans Visual Studio 2010 mais le programme se bloque lors de son exécution. Au lieu d’utiliser test() , utiliser data[0] = 1 fonctionne.

Mon (débutant) suppose que je dois passer un pointeur sur data pour que fonction test() . Comment devrais-je écrire cela?

Tentative

 void test(int *data) { data[0] = 1; } 

Ensuite, en utilisation main test(data) au lieu de simplement test() .

modifier

La tentative fonctionne. Cependant, est-ce une manière “appropriée” de le faire?

Vous pouvez passer des tableaux de manière dynamic de deux manières:

  • En utilisant un pointeur simple, puis en utilisant l’arithmétique de pointeur pour manipuler

void test ( int * data, int i )

  { *(data + i) = 1; //This sets data[i] = 1 } 
  • Ou de cette façon:

    void test(int data[], int i)

    {

     data[i] = 1; //This is the more familiar notation 

    }


L’une ou l’autre de ces manières est la «bonne» façon de procéder.

Lorsque vous utilisez une variable locale en C (dynamic ou statique, tableau ou non), vous devez la transmettre à la fonction qui l’utilisera. C’est ce qui ne va pas avec votre code initial, test() ne sait rien des data .

Lorsque vous déclarez un tableau (dynamic ou statique), vous pouvez le transmettre à la fonction de la même manière. Le code suivant est plutôt inutile, mais il montre qu’utiliser un tableau dynamic n’est en réalité pas différent d’un tableau statique.

 void assign_function(int arr[], int len_of_arr, int *arr2, int len_of_arr2); void print_function(int *arr, int len_of_arr, int arr2[], int len_of_arr2); int main() { int data[2] = {0}; // static array of 2 ints int *data2 = malloc(3 * sizeof(int)); // dynamic array of 3 ints assign_function(data, 2, data2, 3); print_function(data2, 3, data, 2); free(data2); // One difference is you have to free the memory when you're done return 0; } 

Nous pouvons donc transmettre les tableaux, qu’ils soient dynamics ou statiques, via array[] ou sous forme de pointeur, mais nous devons également transmettre un int afin de connaître la taille du tableau.

 void assign_function(int arr[], int len_of_arr, int *arr2, int len_of_arr2) { int count; for(count = 0; count < len_of_arr; count++) //This is the static array arr[count] = count; for(count = 0; count < len_of_arr2; count++) //This is the dynamic array arr2[count] = count; } 

Alors juste pour le plaisir, arr2 quel tableau est passé dans arr et arr2 ici, et comment ils sont consultés:

 void print_function(int *arr, int len_of_arr, int arr2[], int len_of_arr2) { int count; for(count = 0; count < len_of_arr; count++) //This is the dynamic array now printf("arr[%d] = %d\n", count, *(arr+count)); for(count = 0; count < len_of_arr2; count++) //And this is the static array printf("arr2[%d] = %d\n", count, *(arr2+count)); } 

Le point étant, en passant par [] ou en tant que pointeur, et l'access via [] ou un pointeur différé est à vous, les deux vont bien, les deux fonctionnent. J'essaie d'éviter les pointeurs quand je le peux car ils ont tendance à être difficiles à lire et plus sujets aux erreurs lors de l'écriture.

La variable ‘data’ à tester est localisée. Ce ne sont pas les mêmes «données» qui sont en principal. Vous devriez passer un pointeur sur ‘data’ à travers les parameters de test ().