在C中将长数转换为int数组

时间:2014-04-25 10:50:43

标签: c arrays modulo

我已经开始在C中编写一些代码,但我对这种语言很新。我有一个很长的数字,并希望将其转换为int数组。在做了一些研究后,我创建了以下功能:

long long* convertNumberToArray(long long* number, int* length){

    *length = trunc(log10(*number))+1;

    long long num_array[*length];
    int i=*length-1;
    while(*number!=0)
    {
         //when this line is added it works! 
        //printf("fun: modulo: %lld", *number%10);       
        num_array[i] = *number%10;        
        *number = truncl(*number/10);         
        i--;
    }

    long long* return_array = num_array;     

    return return_array;
}

奇怪的是,如果我按原样运行它,例如给出以下数字 123456我从main得到以下输出:

main: 1
main: 2
main: 3
main: 4
main: 5059987506418679813
main: 5473089784

当我添加注释行

printf("fun: modulo: %lld", *number%10)

结果是正确的并且符合预期:

main: 1
main: 2
main: 3
main: 4
main: 5
main: 6

我无法理解这种行为以及插入上述行时它的工作原理。 任何提示或帮助将不胜感激。

提前致谢, 迪娜

2 个答案:

答案 0 :(得分:2)

问题是,您已在num_array内创建convertNumberToArray()作为本地,之后您将返回该变量的地址 - 一旦您从convertNumberToArray()全部返回当地人不再有效。当你这样做时会发生什么是未定义的。当你看到正确的结果时,你才刚刚幸运;但是没有一个数据是安全的。你绝不能(永远都不会......)返回一个局部变量的地址,期望它所指向的数据保持完整。

要正确解决此问题,请创建数组以将数据返回到main()内,并将其作为新参数传递给函数。另一种方法是使用malloc()(或任何其他分配函数)在convertNumberToArray()内的堆上创建缓冲区,但如果这样做,您还必须编写代码以便稍后返回内存(或者您将导致内存泄漏。)

答案 1 :(得分:1)

基本上,您返回一个指向临时数组的指针。函数退出后,不再在堆栈上分配此数组,并且可以覆盖该数组。当它实际被覆盖时,取决于你接下来做什么,但无论你做什么,你都不能依赖它留在堆栈中。

返回数组的一种安全方法是通过malloc在堆上分配它。但是,如果不再需要它,你应该稍后free,否则它将占用其部分内存以供程序的其余部分执行。