在C语言中将长数字转换为int数组
我已经开始用C语言编写一些代码,但我对这种语言还是比较陌生的。我有一个很长的数字,想把它转换成一个整数数组。在做了一些研究之后,我创建了以下函数:在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
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
在堆上分配它。但是,您应该稍后在不再需要它时释放它,否则它将占用它的备忘录部分