您正在返回一个指向本地分配数组的指针。它在堆栈上分配,并在函数返回时消失,使您的指针指向垃圾。
你有几个选择。你可以传入一个数组来填充:
void DecimalToBinary(int result[10],int number){
while(number!=0){
result[n++] = number%2;
number/=2;
}
return result;
}
// usage example:
int b[10];
DecimalToBinary(b, 42);
或者你可以在堆上分配一个数组:
int* DecimalToBinary(int number){
int *a = (int *)malloc(sizeof(int) * 10);
while(number!=0){
a[n++] = number%2;
number/=2;
}
return a;
}
// usage example
int *b = DecimalToBinary(42);
free(b); // when finished with it
或者您可以将数组包装在一个结构中:
typedef struct {
int b[10];
} result;
result DecimalToBinary(int number){
result r;
while(number!=0){
r.b[n++] = number%2;
number/=2;
}
return r;
}
// usage example
result r = DecimalToBinary(42);
如果您使用 malloc() 选项,请不要忘记在完成后释放返回的数据,否则它会挂起。这称为内存泄漏。在更复杂的程序中,它可能会导致严重的问题。
注意:顺便说一句,如果您的数字大于 1023(10 个二进制数字),您将超出数组。您可能还希望在存储 10 位后显式停止,或者传入数组的大小,或者先计算所需的大小并分配那么多空间。此外,如果您的数字为负数,您会得到一些奇怪的结果,您可能想要使用number&1
而不是number%2
.
注意 2:如其他地方所述,您应该将n
其设为本地,或者至少在每次调用该函数时将其重新初始化为 0,否则它只会累积,最终您将超过数组的末尾。