【问题标题】:Assign Returned Pointer to Array将返回的指针分配给数组
【发布时间】:2010-07-29 15:48:45
【问题描述】:

我有一个返回 float* 的函数,它实际上在返回函数中作为数组填充,这样

float* some_fnc()
{
    float *x=malloc(sizeof(float)*4);
    x[0]=......
}
...
// in main
float y[4];
y=some_fnc();

但是我收到“不兼容的类型”错误,这正常吗?有没有办法克服这个问题而无需将 y 声明为 float* ?

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    C 不支持/不允许对数组进行赋值(即使它确实支持数组的初始化,这可能看起来像赋值)。您有多种选择。一种是将数组的地址传递给函数,并让它填充现有数组而不是为其分配空间:

    void some_func(float *array, int size) { 
        for (i=0; i<size;i++)
           array[i] = ...
    // ...
    }
    

    另一种可能性是只在 main 中有一个指针来保存函数返回的指针:

    float *y = some_fnc();
    // use y. Note that array style notation (y[0], y[1], etc.) is still allowed.
    
    // when you're done with y.
    free(y);
    

    【讨论】:

      【解决方案2】:

      您不能修改数组的地址。为什么不将 y 作为参数传递给 some_fnc? (或者)如果您只知道运行时的大小而不使用 main 中的数组,则可以只使用浮点指针。

      【讨论】:

        【解决方案3】:

        在您的代码中,您基本上分配了两个不同的数组,一个在堆栈上,另一个使用malloc。即使您可以在 C 中分配数组(您不能),使用 malloc 分配的数组也会在您每次调用函数时泄漏内存,因此您绝对不应该这样做。

        所以如果你想用malloc在堆上分配你的数组,除了将它定义为float*之外别无他法。如果你这样做了,别忘了free它,你不再需要它了。

        另一方面,如果您真的想要堆栈上的数组(注意可能的 stackoverflow),则必须将此位置传递给您的函数,以便它可以将其用于您的初始化代码。

        【讨论】:

          【解决方案4】:

          正如其他人所提到的,您正在尝试将指针分配给数组,但这是行不通的。如果你真的想这样做,你可以使用结构体。

          struct foo { float f[4]; }
          
          struct foo some_fnc()
          {
              struct foo x;
          
              x.f[0] = 0.1;
              x.f[1] = 1.0;
              x.f[2] = 3.14159;
              x.f[3] = 42;
          
              return x;
          }
          ...
          // in main
          struct foo y;
          y = some_fnc();
          

          另一种选择是将y 的地址传递给some_fnc

          void some_fnc( float x[4])
          {
              x[0]=......
          }
          ...
          // in main
          float y[4];
          some_fnc(y);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-21
            • 2011-04-02
            • 1970-01-01
            • 2018-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多