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