1

このコードはコンパイルおよび実行されますが、修正できない Microsoft コンパイラ エラーが発生します

警告 C4700: 初期化されていないローカル変数 '' が使用されました。

これはコードの最後の行にあると思います

#include <iostream>
using namespace std;

const int DIM0 = 2, DIM1 = 3, DIM2 = 4, DIM3 = 5;

void TestDeclar();

int main(){
    TestDeclar();
    cout << "Done!\n";
    return 0;
}

void TestDeclar(){        
    //24 - array of 5 floats
    float xa[DIM3], xb[DIM3], xc[DIM3], xd[DIM3], xe[DIM3], xf[DIM3];
    float xg[DIM3], xh[DIM3], xi[DIM3], xj[DIM3], xk[DIM3], xl[DIM3];   
    float xm[DIM3], xn[DIM3], xo[DIM3], xp[DIM3], xq[DIM3], xr[DIM3];
    float xs[DIM3], xt[DIM3], xu[DIM3], xv[DIM3], xw[DIM3], xx[DIM3];

    //6  - array of 4 pointers to floats
    float *ya[DIM2] = {xa, xb, xc, xd}, *yb[DIM2] = {xe, xf, xg, xh};   
    float *yc[DIM2] = {xi, xj, xk, xl}, *yd[DIM2] = {xm, xn, xo, xp};
    float *ye[DIM2] = {xq, xr, xs, xt}, *yf[DIM2] = {xu, xv, xw, xx};

    //2 - array of 3 pointers to pointers of floats
    float **za[DIM1] = {ya, yb, yc};    
    float **zb[DIM1] = {yd, ye, yf};

    //array of 2 pointers to pointers to pointers of floats
    float ***ptr[DIM0] = {za, zb};   
    cout << &***ptr[DIM0] << '\n';  
}
4

2 に答える 2

3

の末尾を超えてアクセスしていますptr4DDIM0最後のインデックス 1 より 1 大きい 2 です!

最後の数行を次のように変更します。

//array of 2 pointers to pointers to pointers of floats
float ***ptr4D[DIM0] = {za, zb};   
cout << &***ptr4D[0] << '\n';  
于 2012-10-13T03:33:05.913 に答える
0

私があなたを助けることができるかどうかはわかりませんが、私のLinuxマシンでそれを実行しようとして何が悪いのかを見つけようとしました。比較するためにubuntuマシンでコンパイルしましたが、問題はありませんでした。コンパイラにすべてのオプション警告をオンにするように指示しました(-Wallオプションを渡します)。走っているとき、私はこれを手に入れました:

# Compiled it with -Wall to enable all warning flags and -g3 to produce extra debug information
~$ g++ -Wall stackoverflow.cpp -g3
./a.out 
Segmentation fault (core dumped)

次に、GDB(GNUデバッガー)でデバッグしようとしましたが、次のようになりました。

(gdb) r
Starting program: /home/ubuntu/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400986 in TestDeclar () at stackoverflow.cpp:34
34          cout << &***ptr4D[DIM0] << '\n';  
(gdb) s

したがって、問題はcoutラインにあるようです。コードをもう一度確認すると、DIM0の値は2であるため、ptr4D以外のメモリアドレスにアクセスしようとしています。user1721424が述べたように、 DIM00に置き換えるだけで、完了です。

#After fixing it:
~$ ./a.out 
0x7fff74cd3830
Done!

それが役に立てば幸い!

于 2012-10-13T03:36:35.410 に答える