Как сделать функцию для чтения массива в c?

Я должен написать функцию для чтения длины массива и массива и сделать этот массив доступным для использования в других функциях.

Я много читал о указателях, но я не нашел ответа на свой вопрос. Вот мой код.

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; } 

Предупреждения в кодовых блоках: warning: assignment makes pointer from integer without a cast и warning: 'ar' is used uninitialized in this function [-Wuninitialized]| ,

Этот вопрос отличается от того, что доступ к динамической памяти работает только внутри функции, потому что я должен прочитать длину массива в функции readArray. И для меня, как для начинающего, разница лишь в большой разнице.

Я бы рассмотрел два варианта. Один возвращает указатель на массив и сохраняет длину как указатель, а другой возвращает длину, но принимает указатель на указатель как параметр.

Вариант 1. Возвращаем указатель массива и передаем указатель на параметр длины

Эта опция вернет указатель на выделенный и заполненный массив, и длина будет сохранена в указатель, переданный как параметр

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

и я буду использовать его так:

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

Вариант 2: передать указатель на указатель на массив и вернуть длину массива

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

Использование:

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

Я бы пошел с этим вариантом.

Вы действительно хотите это:

 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; } 

Переменные передаются по значению в C, включая указатели. С вашим решением:

 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 является локальной переменной readArray и pointer никогда не будет изменен в main .

Учти это:

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