相关疑难解决方法(0)

为什么定义数组之外的第一个元素默认为零?

我正在准备 C++ 入门课程的期末考试。我们的教授给了我们这个问题来练习:

解释为什么代码会产生以下输出:120 200 16 0

using namespace std;
int main()
{
  int x[] = {120, 200, 16};
  for (int i = 0; i < 4; i++)
    cout << x[i] << " ";
}
Run Code Online (Sandbox Code Playgroud)

该问题的示例答案是:

cout 语句只是循环遍历其下标由 for 循环的增量定义的数组元素。元素大小不是由数组初始化定义的。for 循环定义了数组的大小,该大小恰好超出了初始化元素的数量,因此最后一个元素默认为零。第一个 for 循环打印元素 0 (120),第二个循环打印元素 1 (200),第三个循环打印元素 2 (16),第四个循环打印默认数组值零,因为元素 3 没有任何初始化。现在 i 点超出了条件并且 for 循环终止。

我有点困惑为什么数组之外的最后一个元素总是“默认”为零。为了进行实验,我将问题中的代码粘贴到我的 IDE 中,但将 for 循环更改为for (int i = 0; i < 8; i++). 然后输出更改为120 200 16 0 4196320 0 …

c++ arrays initialization undefined-behavior zero-initialization

92
推荐指数
5
解决办法
6656
查看次数

使用g ++构建的C++中的运行时数组边界检查

有没有办法在C++编译中使用g++?进行数组边界检查?

理想情况下,不应以任何方式修改源代码.使用std::vector,std::tr1::array或者boost::array是不是一种选择,因为它的代码量很大,这样的转变将是不可行的.

c++ arrays

19
推荐指数
2
解决办法
1万
查看次数

为什么编译和运行代码时代码工作正常,即使我没有提到数组的大小?

class array {
    public:
        int arr[];

        array() {
            arr[0] = 1;
            arr[100] = 2;
        }
};

int main() {
    array a;
    cout << a.arr[0] << a.arr[100] << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在运行上面的代码时期待分段错误.但是,它打印了正确的输出,即使我没有提到数组大小.这是什么原因?

c++ segmentation-fault

0
推荐指数
1
解决办法
66
查看次数