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

标签 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

我无法理解这种行为,也无法理解为什么在插入上述行时它会起作用。 任何提示或帮助将不胜感激。

提前致谢, 迪娜

最佳答案

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

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

关于在 C 中将长整数转换为 int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290981/

相关文章:

java - JsInterop - 获取数组中的值

php - CakePHP - 使用 HABTM 连接表字段排序

javascript - 冗长的 javascript 条件寻求简化

c - 用 C 语言编写打印方法

c - 尝试从文件读取行返回不正确的行

javascript - 在填充对象数组中查找值 mongodb - lodash

c++ - 即使在编译时不知道值,模运算是否更快?

java - 使用 Java 原子类进行模块化增量

c - C 中的指针声明与有限数组声明

c++ - Ubuntu 如何在 C++ 中检查当前 CPU 温度