1

当它不是 Obj-C 对象时,我想确保指针 myFunction() 返回的值可用。

double * vectorComponents ();   //Just an example

double * vectorComponents ()
{
    double componentSet[] = {1, 2, 3};
    return componentSet;
}

如何动态分配这些变量,然后如何释放它们。如果我不做任何事情,它就不会起作用。感谢大家。

NSLog(@":)");
4

3 回答 3

5

您可以使用 C 标准库函数malloc()free()

double *vectorComponents()
{
    double *componentSet = malloc(sizeof(*componentSet) * 3);
    componentSet[0] = 1;
    componentSet[1] = 2;
    componentSet[2] = 3;
    return componentSet;
}

double *comps = vectorComponents();

// do something with them, then
free(comps);

(文档

还:

如果我不做任何事情,它就不会起作用。

也许值得一提的是它没有工作,因为它调用了未定义的行为。componentSet在您的代码中是一个本地自动数组 - 它在其范围结束时无效(即它在函数返回时被释放 - 正是您不想发生的事情。

于 2012-12-04T18:58:07.980 回答
2

如果您返回一个在函数中动态分配的指针,那么调用者将拥有该对象的所有权,并且需要释放该值。

/**
* Returns ownership, use free to release the value when done.
*/
double * vectorComponents()
{
    double *componentSet = malloc(sizeof(double) * 3);

    componentSet[0] = 1.0;
    componentSet[1] = 2.0;
    componentSet[2] = 3.0;

    return componentSet;
}

void example()
{
    double *components = vectorComponents();

    //use components

    free(components);
}
于 2012-12-04T18:59:57.737 回答
1

鉴于您的示例,第一个问题是您真的需要动态分配吗?如果您只想返回在函数内部初始化的数组的地址,您可以使用static变量:

double * vectorComponents ()
{
   static double componentSet[] = {1, 2, 3};
   return componentSet;
}

如果您确实需要一个动态数组,那么有很多方法可以做到这一点。如果您计算数组,您可以稍后malloc()存储。free()如果您希望初始化一个动态数组,则可以更改值并返回它,您可以使用静态数组来执行此操作。例如:

double * vectorComponents2 ()
{
   static double componentSet[] = {1, 2, 3};
   double *dynamic = malloc(sizeof(componentSet));
   memcpy(dynamic, componentSet, sizeof(componentSet)); // copy values
   // modify contents of dynamic here if needed
   return dynamic;
}

使用memcpy静态数组比设置单个值要短,并且可以轻松更改数组的内容和大小。

于 2012-12-04T23:05:37.877 回答