c++ - CPP struct 的诡异问题
ringa_lee
ringa_lee 2017-04-17 13:29:32
0
2
569

#include<iostream>
#include<cmath>
using namespace std;


struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};


int main()
{
    int a[3];
    for(int i=0;i<4;i++){
        a[i]=i+1;
    }

    ListNode*h = new ListNode(0);
    for(int i=0;i<4;i++){
        ListNode*t =new ListNode(a[i]);
        t->next = h->next;
        h->next = t;
        cout<<"t "<<i<<" "<<t->val<<endl;
    }

    ListNode*h2 = new ListNode(0);
    cout<<h2->val<<endl;
    for(int j=0;j<4;j++){
        ListNode*t2 =new ListNode(a[j]+1);
        t2->next = h2->next;
        h2->next = t2;
        cout<<"t2 "<<j<<" "<<t2->val<<endl;
    }
    return 0;
}

这段构建结构体的代码,错误在a[]的初始化,应该初始化4个,a[4]。我的问题是为什么每一次,都会是上面的那个结构体的输出为符合预期的值呢?

ringa_lee
ringa_lee

ringa_lee

全部回覆(2)
大家讲道理

這是常識問題:

  1. C/C++ 中數組下標是從 0 開始的,int a[sz];定義了從a[0]a[sz-1]sz個元素。

  2. 陣列存取越界是未定義行為。

為什麼每次,都會是上面的那個結構體的輸出為符合預期的值呢?

與編譯器的實作有關,每個編譯器對於未定義的行為採取的實作不一定相同。你的上面結構體中保存的是a[0]~a[3]這4 個元素,下面結構體保存的是a[1]~a[4]這4 個元素,其中對於a[3]a[4]的訪問均越界了,是未定義的行為。由於你之前循環賦值時把a[3]越界賦值為4(你的編譯器實現為正常賦值,覆蓋a[3]所在內存的內容),而未越界賦值a[4](未賦值的內置類型局部變量其數值是未定義的,換句話說,你的編譯器實作為隨機數),所以會出現截圖中的結果。

實際編程時應禁止涉及未定義行為。

左手右手慢动作

int a[3]表示陣列長度是3...

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板