2014-12-06 50 views
1

當我通過gcc(g ++)/ Cygwin編譯並運行該程序時,它編譯並按預期行事。Visual Studio '13(訪問衝突)

#include <iostream> 
using namespace std; 

int main(int argc, char* argv[]) { 
for (int arg = 1; arg <= argc; arg++) 
    { 
     cout << argv[arg] << endl; 
    } 
return 0; 
} 

但是,在使用Visual Studio 13進行編譯時,程序會編譯,但執行時會給出訪問衝突。是什麼賦予了?

demo.exe中0x000B5781未處理的異常:0xC0000005:訪問衝突讀取位置0x00000000。

+1

'ARG <= argc'所以,如果你有一個參數('ARGC = 1'),你會得到'ARG = 1'和'1 <= 1',然後去和做'的argv [1]'這是一個論點的第二個。此外,似乎Visual Studio編譯的代碼很好,這一點可以從以下事實得到證明:編譯並運行程序。 – 2014-12-06 02:38:01

+0

是的,我應該有不同的措辭。 – ever99 2014-12-06 19:32:58

回答

3

argv是指向包含argc+1元素的數組的第一個元素的指針。該數組的第一個argc元素包含指向由環境(通常這些字符串中的第一個是程序的名稱,後跟命令行參數)給出的以null結尾的字符串的第一個元素的指針。

此陣列(所述的argc + 1個元素,它argv[argc]指)的最後一個元素是一個空指針。你的代碼將這個空指針解引用,導致未定義的行爲。

這裏要注意的重要一點是在C++中數組的索引是基礎的,而不是基於一個。這意味着長度爲n的數組arr的第一個元素是arr[0],最後一個元素是arr[n-1]。您的代碼似乎假定此數組的第一個元素是arr[1],最後一個元素是arr[n]

+0

謝謝,我想我沒有足夠重視我在做什麼。 – ever99 2014-12-06 19:35:29