从没有静态整数的C / C ++中的函数返回数组指针

时间:2014-12-08 15:53:19

标签: c++ c arrays pointers

我要写一段代码(Function),它返回一个指向数组的指针。 但我不知道该怎么做。 我写的代码是:

int* prime_factor(int temp){
int ctr;
int *ret;
int i = 0;
while (temp != 1){
    ctr = 2;
    if (temp%ctr != 0){
        ctr++;
    }
    else {
        *(ret + i) = ctr;
        temp /= ctr;
    }
}
return ret;
}  

我想有必要这样做:

else {
        ret = new int[1];
        *(ret +i) = ctr;
        temp /= ctr;
    }  

但是如你所知,这些东西的实现需要删除你已经分配的内存,所以我们必须删除函数外的内存,所以它将是非标准函数。 实际上,我想计算一个数字的Prime因子然后将它们退出。 有没有想过这样做?我不知道我该怎么做才能获得目标。 非常感谢你。

5 个答案:

答案 0 :(得分:1)

我看到你的问题还有标签C++所以你可以使用C ++。我真的不知道你的意思是什么没有静态整数......

使用vector

#include <vector>
vector<int> prime_factor(int number)
{
    int ctr = 2;
    vector<int> factors;

    while (number != 1)
    {
        if (number % ctr != 0) 
            ctr++;
        else
        {
            factors.push_back(ctr);
            number /= ctr;
        }
    }
    return factors;
}

因为你将使用带整数的向量,它知道如何销毁(“删除”)它自己。

示例:

int main()
{
    for (auto &x : prime_factor(20))    // C++11
    {
        cout << x << endl;
    }
}

输出:

2
2
5

答案 1 :(得分:0)

是的,将删除数组的负担放在用户身上是不可取的。在这里你最好使用vector而不是plain array。

您还可以将数组作为参数传递(在调用者中创建,以便在该数组上使用delete更直观)到此函数。

答案 2 :(得分:0)

*(ret + i) = ctr;会立即创建内存冲突,因为您的ret指针没有分配的内存指向。一些内存为它预分配内存,要么在代码中静态(数组声明)CALLING this函数,并将其作为参数传递给函数,要么动态地(使用malloc或类似)然后在某些内容中释放它点。动态分配可以在函数本身或调用代码中完成。但再次,free之后的记忆。

答案 3 :(得分:0)

  

&#34;但是如你所知,这些东西的实现需要删除你已经分配的内存,所以我们必须删除函数外部的内存,因此它将是非标准函数。&#34 ;

为避免这种困境,c ++引入了 Dynamic memory management 支持。

不使用像int*这样的原始指针,而是使用适当的


除此之外,使用 std::vector<int> 似乎比使用简单的int*更合适。 std::vector<int>类也旨在让您无法自行获得动态内存管理。

答案 4 :(得分:0)

int *ret;

在您的情况下,ret并未指向任何内存位置。您正在尝试引用某些未分配的内存位置,这可能会导致分段错误。 只是为了展示如何返回指针并将其释放到下面是示例:

int *some()
{
   int *ret = malloc(sizeof(int));
   *ret = 10;
   return ret;
}

int main()
{
   int *p = some();
   printf("%d\n",*p);
   free(p);
}