none
請教:相同程式碼在VS2008與VS2010的執行結果不同 RRS feed

  • 問題

  • 各位前輩好,

    目前在練習C++的程式,

    因為上課需求,

    我會將程式碼帶來帶去,

    在學校與家中的電腦內執行,

    一開始在兩者的電腦中執行結果是一樣的,

    後來寫到某個段落,

    發現相同程式碼在兩者間的執行結果是不一樣的,

    家中電腦是win7 64bit VS2010,

    學校電討是win7 64bit VS2008,

    在我加入以下情形的程式碼之後結果便產生差異(C++環境):

    main

    {

       ...

       float *a;

       a = new float[1];

       a[0] = 1;

       fun(a);

       cout << a[0] << endl;    <=在這兩行輸出時,兩個環境下的結果是不一樣的

       cout << a[1] << endl;

       ...

    }

    void fun(float *b)

    {

       ...

       float temp;

       temp = b[0];

       delete[] b;

       b = new float[2];

       b[0] = temp;

       b[1] = 2 ;

       return ;

    }

    請問為甚麼會出現結果差異的情形呢?

    謝謝各位前輩解答!




    • 已編輯 WSW0605 2013年7月23日 上午 04:08 不好意思,我將函數內的引數名稱改成和main裡面的陣列名稱不同,這樣才不會搞混
    2013年7月23日 上午 03:11

解答

  • func函式需要float*型態的參數, 而main函式傳入float*型態的變數, 所以在VS2008和VS2010都是Call By Value
    • 已標示為解答 WSW0605 2013年7月29日 上午 10:52
    2013年7月24日 上午 02:48

所有回覆

  • 不一樣是怎麼個不一樣法?

    請提供輸出的結果。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年7月23日 上午 03:25
    版主
  • 喔喔不好意思,

    在2010輸出的話,

    a[0] =1;

    a[1] =2;

    也就是我要的正確輸出結果,

    但是在2008輸出的話,

    會是像這樣:

    a[0] =0.005267;         

    a[1] =0.35776177;    <=兩者輸出接不是預期結果

    我在想是不是在2008執行時,

    a陣列被傳到函數去,

    由b來接收這個位址,

    此時a和b兩者是指向同一陣列位址的,

    但是我在函數中刪除b指向的陣列(也就是a陣列位址),

    並重新建立一陣列給b去指向,

    這時候a變數指向不明的位址,

    所以才造成2008的結果,

    但是這種情況再2010就不會出現,

    因此我很疑惑,

    謝謝前輩解答。

    p.s.  

    在我的程式中,函數接收引數的變數名稱和我在main裡面的名稱是一樣的,

    就像這樣:

    main{

    float *a;

    a = new float[1];

    fun(a);

    }

    void fun(float *a)

    {

    ...

    }


    • 已編輯 WSW0605 2013年7月23日 上午 04:20 想法說明
    2013年7月23日 上午 03:48
  • VS008和VS2010兩者執行會產生不同結果的原因是您傳陣列為參數的做法為Call by Value, 所以func函數無法新配置的陣列的內容, 造成a陣列的內容值為未定義之故
    2013年7月23日 上午 05:53
  • 喔喔,

    所以在VS2008的環境下傳陣列的話是傳Value,

    而在VS2010的環境下傳陣列的話是傳Path囉?

    謝謝前輩解答!

    2013年7月23日 下午 12:37
  • func函式需要float*型態的參數, 而main函式傳入float*型態的變數, 所以在VS2008和VS2010都是Call By Value
    • 已標示為解答 WSW0605 2013年7月29日 上午 10:52
    2013年7月24日 上午 02:48