Comment faire une fonction pour lire un tableau en c?

Je dois écrire function pour lire la longueur du tableau et le tableau et le rendre utilisable dans d’autres fonctions.

J’ai lu beaucoup de choses sur les pointeurs mais je n’ai pas trouvé de réponse à ma question. Voici mon code.

int readArray(int *ar, int *pointer){ int i, length; scanf("%d", &length); ar = (int *) malloc(length * sizeof(int)); for(i = 0; i < length; i++){ scanf("%d", pointer + i); } return length; } void printArray(int *pointer, int length){ int i; for(i = 0; i < length; i++){ printf("%d ", *(pointer + i)); } } int main(){ int *pointer, *ar, length; pointer = ar[0];//Here I get the warnings. length = readArray(ar, pointer); printArray(pointer, length); return 0; } 

Les avertissements dans codeblocks: warning: assignment makes pointer from integer without a cast transt et warning: 'ar' is used uninitialized in this function [-Wuninitialized]| .

Cette question est différente de cet access mémoire dynamic ne fonctionne que dans la fonction parce que je dois lire la longueur du tableau dans la fonction readArray. Et pour moi, en tant que débutant, seule une petite différence est une grande différence.

Je considérerais avec 2 options. L’un renvoie le pointeur à un tableau et enregistre la longueur en tant que pointeur et un autre renvoie la longueur, mais accepte le pointeur sur un pointeur en tant que paramètre.

Option 1: renvoyer le pointeur du tableau et le passer au paramètre de longueur

Cette option retournera le pointeur sur le tableau alloué et rempli et sa longueur sera sauvegardée sur le pointeur passé en paramètre.

 int* readArray(int* length) { int* arr; //Scan for length scanf("%d", length); //Allocate memory arr = (int *)malloc(...); //Fill data ... return arr; } 

et je vais l’utiliser comme ça:

 int length; int *pointer; pointer = readArray(&length); printArray(pointer, length); 

Option 2: passer le pointeur au pointeur du tableau et renvoyer la longueur du tableau

 int readArray(int ** ar) { int length; .... *ar = (int *)malloc(...); ... return length; } 

Usage:

 int* ar; int length; length = readArray(&ar); printArray(ar, length); 

J’irais avec cette option.

Vous voulez réellement ceci:

 int readArray(int **ar) { int i, length; scanf("%d", &length); *ar = (int *)malloc(length * sizeof(int)); for (i = 0; i < length; i++) { scanf("%d", &(*ar)[i]); } return length; } void printArray(int *pointer, int length) { int i; for (i = 0; i < length; i++) { printf("%d ", *(pointer + i)); } } int main() { int *ar, length; length = readArray(&ar); printArray(ar, length); return 0; } 

Les variables sont passées par valeur en C, pointeurs inclus. Avec votre solution:

 int readArray(int *ar, int *pointer){ int i, length; scanf("%d", &length); ar = (int *) malloc(length * sizeof(int)); for(i = 0; i < length; i++){ scanf("%d", pointer + i); } return length; } 

ar est une variable locale à readArray et le pointer ne sera jamais modifié dans main .

Considère ceci:

 void foo(int bar) { bar = 123; } ... int a = 1; foo(a); // a won't contain 123 here