2014-12-06 53 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