【问题标题】:Convert a long number into int array in C在 C 中将 long 数转换为 int 数组
【发布时间】:2014-04-25 10:50:43
【问题描述】:

我已经开始用 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

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

提前致谢, 迪娜

【问题讨论】:

标签: c arrays modulo


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多