将十进制转换为二进制的C ++程序正在获得分段错误

时间:2016-01-01 18:05:31

标签: c++

这是一个将十进制数转换为二进制数的c ++程序。那么有很多可能的方法来实现它,但是当我了解静态变量时,我想要使用它。所以该计划是

#include <iostream>

using namespace std;

int **binary(int num, int &k) {
    static int *p;
    int i = 0;
    while (num > 0) {
        *p = num % 2;
        p++;
        num = num / 2;
        k++;
    }
    return &p;
}

int main() {
    int n;
    int k = 0;
    cout << "\n Enter the number to be converted into binary : ";
    cin >> n;
    int **ptr;
    ptr = binary(n, k);
    cout << "\n The number of bytes in the binary number is : " << k << endl;
    cout << "\n The binary code is : \n";
    for (int i = 0; i < k; i++)
        cout << **(ptr+i);
    return 0;
}

输出:

 Enter the number to be converted into binary : 33
Segmentation fault

调试完这段代码后,我在第9:9行遇到了段错误 即

*p = num % 2;

我不知道为什么这会导致我访问堆栈中未占用的内存空间。

3 个答案:

答案 0 :(得分:4)

发生崩溃的原因是p已初始化为nullptr。取消引用未初始化的变量是未定义的行为,因此您会崩溃。

免责声明:以下代码旨在修复您的代码。它并不是为了说明这样做的正确方法,也不是为了显示一般编码的好方法。

如果您希望使用函数静态变量,并且您的函数必须返回指向指针的指针,请通过将其指向另一个p变量来初始化static,该变量为您提供缓冲区:

static int pVal[100];
static int * p;
p = pVal; // This should be done in an assignment, not in initializer

注意:返回指向static存储的指针会使您的代码不可重入,这通常是一种非常糟糕的做法。这段代码可以作为一种学习练习,但不是生产代码中应该使用的代码。

答案 1 :(得分:1)

永远不会设置

override func didMoveToView(view: SKView) { if interAd.loaded { // Check if ad is loaded closeButton.frame = CGRectMake(20, 20, 30, 30) closeButton.layer.cornerRadius = 15 closeButton.setTitle("x", forState: .Normal) closeButton.setTitleColor(UIColor.blackColor(), forState: .Normal) closeButton.backgroundColor = UIColor.whiteColor() closeButton.layer.borderColor = UIColor.blackColor().CGColor closeButton.layer.borderWidth = 1 loadAd() closeButton.addTarget(self, action: "close:", forControlEvents: UIControlEvents.TouchDown) } else { print("Interstitial not loaded yet!") } } 。它被初始化为static int * p;,解除引用它会调用未定义的行为。建议不要使用静态缓冲区,最好将数组传递给函数并返回位数。此外,您应该以相反的顺序输出这些位。

由于您对NULL局部变量感兴趣,因此以下是您的代码的更正版本:

static

这是一个不使用静态缓冲区的版本:

#include <iostream>

using namespace std;

int *binary(int num, int &k) {
    static int bits[sizeof(int) * 8];
    int *p = bits;
    k = 0;
    while (num > 0) {
        *p = num % 2;
        p++;
        num = num / 2;
        k++;
    }
    return p;
}

int main() {
    int n;
    int k = 0;
    cout << "\n Enter the number to be converted into binary : ";
    cin >> n;
    int *ptr = binary(n, k);
    cout << "\n The number of bits in the binary number is : " << k << endl;
    cout << "\n The binary code is : \n";
    for (int i = 0; i < k; i++)
        cout << ptr[k - i];
    return 0;
}

答案 2 :(得分:0)

代码有很多问题:

  • binary()不会将指针p初始化为任何内容。
  • binary()取消引用已初始化的p并修改该值。
  • 转换从LSB写入MSB,输出也按此顺序写入。

您需要分配一个缓冲区来接收转换。这是最安全的呼叫者。由于您最终输出了字符10,因此您的转换也可以将这些字符值直接写入字符串。