无法返回int数组

1 c arrays

我想只使用studio.h库将十进制数转换为二进制数,通过使用数组存储余数但结果不正确,也许我有内存分配问题或返回值有误,请帮我检查一下.非常感谢!

#include <stdio.h>
int  n = 0;
int* DecimalToBinary(int number){
    int a[10];      
    while(number!=0){
        a[n++] = number%2;
        number/=2;
    }
    return a;
}

void main(){

    int *d1 = DecimalToBinary(5);
    int *d2 = DecimalToBinary(10);

    for(int i = n-1 ;i>=0;i--)
        printf(" %d",d1[i]);

    printf("\n");

    for(int i = n-1 ;i>=0;i--)
        printf(" %d",d2[i]);

}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 8

您返回指向本地数组的指针.该本地数组位于堆栈中,当函数返回时,数组超出范围,并且在调用下一个函数时将重用堆栈内存.这意味着指针现在将指向其他一些数据,而不是原始数组.

有两种解决方案:

  1. 在函数调用中 声明数组DecimalToBinary并将其作为参数传递.
  2. 在堆上动态创建数组(例如with malloc)并返回该指针.

方法2的问题是如果不free返回指针,它可能会创建内存泄漏.


正如Craig所指出的,还有第三个解决方案,即static在函数内部创建数组.然而,在这种情况下,它带来了比我最初列出的两个解决方案更多的问题,这就是为什么我没有列出它.

正如Uchia Itachi所指出的那样,代码还存在另一个严重的问题,那就是数组被全局变量索引.如果DecimalToBinary使用太大的数字或多次调用函数,则此全局索引变量对于数组将变大,并且将超出该数组的范围.

解除引用指向范围外数组的指针和索引超出范围的问题都会导致未定义的行为.如果幸运的话,未定义的行为会导致打印出错误的结果.如果你运气不好会导致程序崩溃.

  • 还有第三种解决方案,即声明为静态.这确实会产生一个问题,即您不能多次使用此函数,或者如果这样做,您必须首先复制上一个函数调用中的值. (2认同)