【问题标题】:Visual Studio '13 (Access Violation)Visual Studio '13(访问冲突)
【发布时间】:2014-12-06 02:34:31
【问题描述】:

当我通过 gcc(g++)/Cygwin 编译和运行这个程序时,它会编译并按预期运行。

#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。

【问题讨论】:

  • arg &lt;= argc 因此,如果您有 1 个参数 (argc = 1),您将得到 arg = 11 &lt;= 1,然后继续执行 argv[1],这是...中的第二个论据。此外,Visual Studio 似乎可以很好地编译代码,事实证明......它编译并且您运行了程序。
  • 是的,我应该换种说法。

标签: visual-c++ access-violation argv


【解决方案1】:

argv 是指向包含argc+1 元素的数组的第一个元素的指针。该数组的第一个argc 元素包含指向以空结尾的字符串的第一个元素的指针,这些字符串表示环境给程序的参数(通常这些字符串中的第一个是程序的名称,然后是命令行参数)。

这个数组的最后一个元素(argc+1th 元素,argv[argc] 引用)是一个空指针。您的代码取消引用此空指针,导致未定义的行为。

这里要注意的重要一点是,C++ 中的数组索引是基于,而不是基于一个。这意味着长度为n 的数组arr 的第一个元素是arr[0],最后一个元素是arr[n-1]。您的代码似乎假定此类数组的第一个元素是 arr[1],最后一个元素是 arr[n]

【讨论】:

  • 谢谢,我想我对自己所做的事情没有给予足够的关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多