在C语言中将长数字转换为int数组

在C语言中将长数字转换为int数组,c,arrays,modulo,C,Arrays,Modulo,我已经开始用C语言编写一些代码,但我对这种语言还是比较陌生的。我有一个很长的数字,想把它转换成一个整数数组。在做了一些研究之后,我创建了以下函数: long long* convertNumberToArray(long long* number, int* length){ *length = trunc(log10(*number))+1; long long num_array[*length]; int i=*length-1; while(*numb

我已经开始用C语言编写一些代码,但我对这种语言还是比较陌生的。我有一个很长的数字,想把它转换成一个整数数组。在做了一些研究之后,我创建了以下函数:

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
我无法理解这种行为,以及插入上述行时为什么会起作用。 任何提示或帮助都将不胜感激

提前感谢,,
Dina

问题在于,您已经在
convertNumberToArray()
中创建了
num_数组
作为局部变量,然后返回该变量的地址——一旦从
convertNumberToArray()
返回,它的所有局部变量都不再有效。当您这样做时会发生什么是未定义的。当你看到正确的结果时,你就幸运了;但这些数据都不安全。您绝不能(永远…)返回局部变量的地址,期望它所指向的数据保持不变


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

问题是您已经在
convertnumbertary()
中创建了
num\u数组
作为本地变量,然后返回该变量的地址--一旦从
convertnumbertary()
返回,它的所有本地变量都不再有效。当您这样做时会发生什么是未定义的。当你看到正确的结果时,你就幸运了;但这些数据都不安全。您绝不能(永远…)返回局部变量的地址,期望它所指向的数据保持不变


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

问题是您已经在
convertnumbertary()
中创建了
num\u数组
作为本地变量,然后返回该变量的地址--一旦从
convertnumbertary()
返回,它的所有本地变量都不再有效。当您这样做时会发生什么是未定义的。当你看到正确的结果时,你就幸运了;但这些数据都不安全。您绝不能(永远…)返回局部变量的地址,期望它所指向的数据保持不变


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

问题是您已经在
convertnumbertary()
中创建了
num\u数组
作为本地变量,然后返回该变量的地址--一旦从
convertnumbertary()
返回,它的所有本地变量都不再有效。当您这样做时会发生什么是未定义的。当你看到正确的结果时,你就幸运了;但这些数据都不安全。您绝不能(永远…)返回局部变量的地址,期望它所指向的数据保持不变


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

基本上,返回指向临时数组的指针。一旦函数退出,该数组就不再在堆栈上分配,并且可以被覆盖。但是,它被覆盖的时间取决于下一步要做什么,但无论做什么,都不能依赖它留在堆栈中


返回数组的安全方法是通过
malloc
在堆上分配它。但是,您应该稍后在不再需要它时释放它,否则它将在程序的其余执行过程中占用部分内存。

基本上,您返回一个指向临时数组的指针。一旦函数退出,该数组就不再在堆栈上分配,并且可以被覆盖。但是,它被覆盖的时间取决于下一步要做什么,但无论做什么,都不能依赖它留在堆栈中


返回数组的安全方法是通过
malloc
在堆上分配它。但是,您应该稍后在不再需要它时释放它,否则它将在程序的其余执行过程中占用部分内存。

基本上,您返回一个指向临时数组的指针。一旦函数退出,该数组就不再在堆栈上分配,并且可以被覆盖。但是,它被覆盖的时间取决于下一步要做什么,但无论做什么,都不能依赖它留在堆栈中

返回数组的安全方法是通过
malloc
在堆上分配它。但是,您应该稍后在不再需要它时释放它,否则它将占用它的备忘录部分