2015-04-05 239 views
2
#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 

我不这样做为什么这不起作用......我试图支持一个数组,但问题出在第二个数字上。可以有人帮忙;)感谢将整数转换为数组数组的函数C++

回答

1

的问题是,你把你的结果到函数结束时被摧毁了当地的阵列。您需要dynamicaly分配阵列,使得其寿命并不局限于它在创建的函数:

#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>而不是内置阵列

+0

Yeaah ...非常感谢我明白我的错误... :) – 2015-04-05 23:30:35

+0

标准集装箱管理动态分配数组(或多个对象,更一般的集合),而智能指针通常管理一个动态分配的对象的生命周期(不是数组)。智能指针清理时,使智能指针管理动态分配的数组会导致未定义的行为。 – Peter 2015-04-05 23:53:42

+0

@Peter'的std :: unique_ptr'处理使用专业化数组:http://stackoverflow.com/a/6713515/3807729 [性病::的unique_ptr](http://en.cppreference.com/w/cpp/memory /的unique_ptr)如果提供了定制删除 – Galik 2015-04-05 23:58:30

0

当然它无法正常工作。

充其量,行为是不确定的,因为Arg()正在返回main()不再存在的本地变量(arg)的地址。 main()使用那个返回的地址,当它不是你的程序所关心的任何东西的地址时。

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

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

如果你这样做是正确的,你甚至不会需要在你的代码的任何地方使用指针。