将整数转换为数字c ++数组的函数

时间:2015-04-05 23:18:38

标签: c++

#include<iostream>
using namespace std;

int *Arr(int y,int size){
int arg[size];
for(int i=size-1;i>=0;i--){
    arg[i]=y%10;
    y=y/10;
}
return arg;
}
int main(){
int *p=Arr(2587,4);
for(int j=0;j<4;j++){
  cout<<p[j]<<"   ";
}
return 0;
}

> Blockquote

我不知道为什么这不起作用......我试图支持一个阵列,但问题是在第二位。可以帮助某人;)谢谢

2 个答案:

答案 0 :(得分:1)

问题是你将结果放入一个在函数结束时被销毁的本地数组。您需要动态分配数组,以使其寿命不限于在其中创建的函数:

#include<iostream>
using namespace std;

int *Arr(int y, int size)
{
    // This local array will be destroyed when the function ends
    // int arg[size];

    // Do this instead: allocate non-local memory
    int* arg = new int[size];

    for(int i = size - 1; i >= 0; i--)
    {
        arg[i] = y % 10;
        y = y / 10;
    }
    return arg;
}

int main()
{
    int *p = Arr(2587, 4);
    for(int j = 0; j < 4; j++)
    {
        cout << p[j] << "   ";
    }

    // You need to manually free the non-local memory
    delete[] p; // free memory

    return 0;
}

注意:

如果可能,应避免使用new分配动态内存。您可能想要研究智能指针来进行管理。

另外,在真正的C++代码中,您将使用像std::vector<int>这样的容器而不是内置数组

答案 1 :(得分:0)

当然它不起作用。

充其量,行为未定义,因为Arg()正在返回(arg)不再存在的局部变量main()的地址。 main()使用返回的地址,如果它不是您的程序所涉及的任何地址。

还有一个偶然的问题是int arg[size],其中size在编译时没有修复,是无效的C ++。根据编译器的严格程度(某些C ++编译器拒绝无效C ++的构造,但其他人接受这样的扩展),您的代码甚至无法成功编译。

要解决此问题,请让您的函数返回std::vector<int>vector是标准标题<vector>中定义的模板化容器)。然后你需要做的就是将值添加到本地向量中,该值可以通过值安全地返回给调用者。

如果你做得对,你甚至不需要在你的代码中的任何地方使用指针。