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