【问题标题】:Passing a dynamically allocated array from main to another function将动态分配的数组从 main 传递到另一个函数
【发布时间】:2016-10-05 08:13:38
【问题描述】:

首先,我已经看过这里展示的示例:

Passing dynamically allocated array as a parameter in C

我正在尝试将动态分配的数组作为参数传递给另一个函数。

void InputIterations(int *iterations);
void CalcE(long double *E, int iterations);

int main()
{
     int iterations;  
     long double *E;

     InputIterations(&iterations);

     E = (long double *) malloc(iterations * sizeof(long double));

     CalcE(&E, iterations);
}

void InputIterations(int *iterations)
{
     printf("Enter a number of iterations: ");
     scanf("%d", iterations);
}

void CalcE(long double *E, int iterations)
{
     long double sum = 0;
     int i;
     for(i=0; i<iterations; i++)
     {
          sum = sum + /*formula for calculating irrational constant e*/
          *E = sum;
          E++;
     }
 }

但是,当我编译我的代码时,我收到以下错误:

error: cannot convert ‘long double**’ to ‘long double*’ for argument ‘1’ to ‘void CalcE(long double*, int)’ CalcE( &E, iterations );

有谁知道我为什么会收到这个错误?

如果您能解释我的错误或将我指向解释它的来源,我将非常感谢您的帮助。

【问题讨论】:

  • 再次查看错误信息。它真的告诉你所有你需要知道的。如果你仍然不知道,那么回到一本书,阅读更多关于地址运算符 (&amp;) 及其作用的信息。无论如何,您都需要这样做,因为您确实在不止一个地方滥用了它(例如,我建议您也仔细看看 scanf 电话)。
  • 你需要知道Pi已经是一个指针,而&amp;Pi是一个指向指针的指针,一个双指针。所以电话应该是CalcPi(Pi, iterations);
  • 选择一种语言。在 C++ 中,答案很简单,“使用 std::vector”。
  • 好的,我为你选择了一种语言,去掉了 C++ 标签。
  • 如果你使用malloc,你也应该看看free()。

标签: c


【解决方案1】:

这里:

CalcE(&E, iterations);

您获取 E 的地址(类型为 long double *)并将其作为参数传递给 CalcECalcE 接受指向long double 的指针作为第一个参数。但是,当您获取E 的地址时,您实际上会得到一个指向long double (long double**) 的指针,而这不是指向long double 的指针。这就是你的错误告诉你的:

错误:无法将“long double**”转换为“long double*”作为参数 ‘1’ 到 ‘void CalcE(long double*, int)’ CalcE( &E, 迭代);

所以你应该有:

CalcE(E, iterations);

【讨论】:

    【解决方案2】:
    CalcE(&E, iterations);
    

    应该是

    CalcE(E, iterations);
    

    希望我能帮上忙

    【讨论】:

    • 是的,这行得通。谢谢!是不是因为 E 已经是一个指针,所以我不需要传递指针的地址?
    • @Corey 是的,在传递地址时,您试图在预期指针的位置传递双指针,因此出现错误 error: cannot convert ‘long double**’ to ‘long double*’ 并且您的程序泄漏内存,因为您从未释放E 指向的内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2018-05-07
    • 2019-10-04
    • 2015-05-09
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多