【问题标题】:How to make a function to read an array in c? [duplicate]如何制作一个函数来读取c中的数组? [复制]
【发布时间】:2017-05-10 13:08:54
【问题描述】:

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

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

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 函数中读取数组长度。而对我来说,作为一个初学者,只有一点点不同就是很大的不同。

【问题讨论】:

  • pointer = &amp;ar[0];pointer = ar; 警告将消失。但这并不意味着程序可以工作。
  • 仍然是同一代码行的第二个警告(警告:'ar'在此函数[-Wuninitialized]中未初始化使用)
  • 所以初始化它。
  • 我知道如何初始化一个指向变量的指针(int *p, a; p = &a) 但我被困在这里了。

标签: c arrays function pointers


【解决方案1】:

我会考虑 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);

我会选择这个选项。

【讨论】:

    【解决方案2】:

    你真的想要这个:

    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
    

    【讨论】:

    • 这个&amp;(*ar)[i] 让我很困惑。我不明白这个。
    • @Timotei ar 是指向int 的指针。 *ar 是指向int 的指针,实际上这里是指向malloc 分配的length ints 的指针。 (*ar)[n] 是前面提到的ints 中的第n 个int&amp;(*ar)[n] 是指向第 n 个int指针
    • 您将如何编写一个函数来以与上述注释完全相同的方式读取数组并打印数组(在同一函数中)。
    • @Timotei 不太确定我是否理解您的问题。也许你应该发布另一个问题。
    • 我的意思是函数 void printArray(int **pointer, int length) 看起来如何?注意 **pointer 不是 *pointer。
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多