我尝试创建一个将Decimal转换为Binary并返回的程序。我的问题是当分数部分在二进制中变得太大时,我的程序崩溃了。我尝试了很多不同的方法来解决这个问题,但没有一个能够解决这个问题...我不知道为什么会这样,所以我没有解决它。 该程序仅包含问题。
请帮帮我。
example1: 10 10.5 -> Program works fine
example2:10 10.23 -> Program crashes
以上是例子。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(){
int base;
double number;
scanf("%d %lf",&base,&number);
if(base == 10){
//Integer Part
int n = (int)number;
number = number - (double)n;
int i = 0;
char *binaryfirst;
binaryfirst = malloc(sizeof(char*));
while(n != 0){
binaryfirst[i] = (n % 2) + '0';
n /= 2;
i++;
}
binaryfirst[i] = '\0';
strrev(binaryfirst);
//printf("%lf\n%s\n",number,binaryfirst);
//Fractional part
int j = 0;
char *binarysecond;
binarysecond = malloc(sizeof(char*));
//This is The part where I am lost...
for(j = 0; j < 60; j++){ //60 is the maximum length that it can become
number *= 2;
if(number >= 1.0){
binarysecond[j] = '1';
number = number - 1;
}else if(number == 0){
binarysecond[j] = '0';
break;
}else{
binarysecond[j] = '0';
}
printf("%lf; %c\n",number, binarysecond[j]);
}
printf("%d\n",j);
binarysecond[j] = '\0';
//printf("\n%s\n",binarysecond);
//Memory "Let it go"!!!!
/* for(i = 0; i < sizeof(binaryfirst); i++){
free(binaryfirst[i]*2);
}*/
free(binaryfirst);
/* for(j = 0; j < sizeof(binarysecond); j++){
free(binarysecond[j]);
}*/
free(binarysecond);
}
return 0;
}
答案 0 :(得分:4)
此:
binaryfirst = malloc(sizeof(char*));
and
binarysecond = malloc(sizeof(char*));
分配指针的大小,但写入它的循环清楚地表明它希望在该位置存储最多60个字节。这毫无意义;当你编写outsite时,C并没有神奇地增加分配,而是你得到了未定义的行为。
如果你不确定堆内存分配,并且它们对你试图解决的问题不是至关重要的,那么首先不要做任何事情。只需使用简单的数组:
char binaryfirst64];
char binarysecond[64];