这是一个将十进制数转换为二进制数的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;
我不知道为什么这会导致我访问堆栈中未占用的内存空间。
答案 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
并修改该值。您需要分配一个缓冲区来接收转换。这是最安全的呼叫者。由于您最终输出了字符1
或0
,因此您的转换也可以将这些字符值直接写入字符串。