如何使函数读取c中的数组?

时间:2017-05-10 13:08:54

标签: c arrays function pointers

我必须编写函数来读取数组长度和数组,并使该数组能够用于其他函数。

我已经阅读了许多有关指针的内容,但我没有找到问题的答案。 这是我的代码。

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 castwarning: 'ar' is used uninitialized in this function [-Wuninitialized]|

这个问题与此Dynamic memory access only works inside function不同,因为我必须在readArray函数中读取数组长度。对我来说,作为一个初学者,只有很小的差别是一个很大的区别。

2 个答案:

答案 0 :(得分:2)

我会考虑2个选项。一个返回指向数组的指针,并将长度保存为指针,另一个返回长度,但接受指向指针的指针作为参数。

选项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);

我会选择这个选项。

答案 1 :(得分:1)

你真的想要这个:

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

arreadArray的本地变量,pointer永远不会修改main

考虑一下:

void foo(int bar)
{
  bar = 123;
}

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