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

C++ 从C/C+;中的函数返回数组指针+;无静态整数,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我将编写一段代码(函数),返回指向数组的指针。 但我不知道怎么做。 我写的代码是: 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

我将编写一段代码(函数),返回指向数组的指针。 但我不知道怎么做。 我写的代码是:

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;
    }  
但正如你所知道的,这些东西的实现需要删除你分配的内存,所以我们必须删除函数外的内存,所以它将是非标准函数。 实际上,我想计算一个数的素数因子,然后返回它们。 有什么办法吗?我不知道该怎么做才能达到目标。
非常感谢。

是的,将删除数组的负担加在用户身上是不可取的。在这里,最好使用向量而不是普通数组

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

*(ret+i)=ctr
将立即创建内存冲突,因为
ret
指针没有指向的分配内存。您需要为它预先分配内存,或者在调用此函数的代码中静态地(数组声明)并将其作为参数传递给函数,或者动态地(使用
malloc
或类似方法)然后在某个点释放它。动态分配可以在函数本身或调用代码中完成。但是,之后,
释放
内存

“但正如您所知,这些内容的实现需要删除您分配的内存,因此我们必须删除函数外部的内存,因此它将成为非标准函数。”

避免了这个困难,C++引入了<强> <强>支持。 使用适当的

  • (转让所有权)
  • (分享所有权)
  • (分享所有权,但不作为参考)
  • (以“旧方式”转让所有权)

除此之外,使用似乎比使用简单的
int*
更合适。
std::vector
类的另一个目的是让您不必自己进行动态内存管理

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);
}

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

使用


您的代码中还有另一个问题,例如,我可以看到
ctr
它将始终为2,因为语句
ctr=2在每个循环中都会到达。@RaydelMiranda感谢您的回复。在算法中没有任何问题,我测试了它,唯一的问题是我在主题中提到的。在你的算法(你发布的代码)中,ctr永远不会大于3。你说的c/c++是什么意思?你是否局限于C和C++的子集,或者你可以使用它们吗?请更清楚地说明你的语言限制是什么。@RaydelMiranda但它起作用了:|,我不知道怎么做?但是当我调试代码时,我发现它是有效的(使用固定的int数组),所以感谢你的好答案。但是我没有用C++的模型工作,我是编程新手。
#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