0

22 行目に進むと、y から奇妙な値が出力されていることがわかります。y が正しく初期化されていないと思います。しかし、さらに2歩進んでリターンラインに到達すると、数字は正しくなります。

ここで何が起きてるの?最適化をオフにしようとしましたが、うまくいきません

 1#include <iostream>
 2#include <cstring>
 3#include <cmath>
 4using namespace std;
 5
 6const int MD = 10;
 7struct BigNumber{
 8  int digits[MD];
15  }
16
17  BigNumber(){
18    memset( digits, 0, sizeof(digits));
19  }
20
***21  BigNumber test(){
22    BigNumber p,c,y;// on this line , y is seen as garbage
23    p=c;// on this line , y is seen as garbage
24    c=y;
25    //y=p;                                                                                                                      
26    return y; // on this line, y returned to correct number
27=>}***
28
29
30  friend ostream& operator<<(ostream& out, const BigNumber& b );
31};
32
33ostream& operator<<(ostream& out, const BigNumber& b){
34  for( int i=MD-1; i>=0; i-- ){
35     out << b.digits[i];
36  }
37  return out;
38}
39
40
41
42int main( ){
43  BigNumber l("4");
44  BigNumber r;
45  BigNumber p,c,y;
46
47  r=l.test();
48  cout << r << endl;
49  cout << l.test() << endl;
50  return 0;
51}
28
(gdb) p p
$8 = {digits = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
(gdb) p c
$9 = {digits = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
(gdb) p y
$10 = {digits = {1171907, 1235664, -1208027616, 1, 1, 0, 1, 134513360, 134520860, 0}}
(gdb) n
(gdb) n
(gdb) p y
$11 = {digits = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
4

1 に答える 1

0

コンパイラのバグに関連している可能性があります....私がそれを使用すると、エラーがスローされ始めます。 gdb エラー メッセージ: DW_OP_reg、DW_OP_piece、および DW_OP_bit_piece

また、これは配列メンバーが原因ではないことを明確にする必要があります。これは、コンパイラーがメンバー要素ごとのコピーを行うことになっているためです。配列メンバーを使用した既定のコピーの割り当てに関する確認を参照してください

于 2013-04-21T08:23:58.377 に答える