Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::数组和运算符[]_C++_Operators_Stdarray - Fatal编程技术网

C++ std::数组和运算符[]

C++ std::数组和运算符[],c++,operators,stdarray,C++,Operators,Stdarray,国家参考: 返回对位于指定位置(位置号)的元素的引用 执行边界检查 我编写了这个小程序来检查操作符[]的行为: 根据上述结果,我的问题是: 当idx的值假定为18446744073709551615时,为什么上面的代码没有给出分段错误 oprator[]不需要执行绑定检查。因此,它是越界访问。越界访问会导致未定义的行为。意味着任何事情都可能发生。我真的很有意思。例如,它可以点比萨饼。oprator[]不需要做绑定检查。因此,它是越界访问。越界访问会导致未定义的行为。意味着任何事情都可能发生。我真

国家参考:

返回对位于指定位置(位置号)的元素的引用 执行边界检查

我编写了这个小程序来检查操作符[]的行为:

根据上述结果,我的问题是:


当idx的值假定为18446744073709551615时,为什么上面的代码没有给出分段错误

oprator[]不需要执行绑定检查。因此,它是越界访问。越界访问会导致未定义的行为。意味着任何事情都可能发生。我真的很有意思。例如,它可以点比萨饼。

oprator[]不需要做绑定检查。因此,它是越界访问。越界访问会导致未定义的行为。意味着任何事情都可能发生。我真的很有意思。例如,它可以点比萨饼。

正如前面所说的,你面临着未定义的行为。 不过,如果您想使用,可以使用.at而不是运算符[]。这将稍微慢一点,因为它对阵列的每次访问都执行检查


此外,诸如valgrind之类的内存检查器能够在程序运行时找到类似的错误

如前所述,您面临未定义的行为。 不过,如果您想使用,可以使用.at而不是运算符[]。这将稍微慢一点,因为它对阵列的每次访问都执行检查

此外,诸如valgrind之类的内存检查器能够在程序运行时找到类似的错误

>当idx的值假定为18446744073709551615时,为什么上面的代码没有给出分段错误

因为这个大数字是2**64-1,也就是说2提升到64次方,减去1

和数组索引逻辑有关,这与-- 1完全一样,因为2 ** 64值超出了64位硬件可以考虑的值。因此,您正在非法访问[-1],而您的计算机中恰好包含0

在您的记忆中,这是[0]前面的单词。它是堆栈中的内存,硬件完全允许您访问它,因此预计不会发生分段错误

while循环使用大小索引,它本质上是一个无符号的64位数量。因此,当索引递减并从0变为-1时,循环控制测试将-1解释为18446744073709551615一个由64位组成的位模式,所有位都设置为1,这远大于MAX_SZ=5,因此测试失败,while循环停止

如果对此有丝毫疑问,可以通过控制数组a[]周围的内存值进行检查。要做到这一点,您可以将数组a夹在两个较小的数组之间,例如magica和magicb,您可以正确地初始化它们。像这样:

#include <array>
#include <cstddef>
#include <iostream>
using std::array;
using std::size_t;
using std::cout;
using std::endl;

#define MAX_SZ 5

int main (void){

    array<int,2> magica; 

    array<int,MAX_SZ> a;
    size_t idx = MAX_SZ - 1;

    array<int,2> magicb; 

    magica[0] = 111222333;
    magica[1] = 111222334;

    magicb[0] = 111222335;
    magicb[1] = 111222336;

    cout << "magicb[1] : " << magicb[1] << endl;

    while (idx < MAX_SZ) {
        cout << idx << ":" << a[idx] << endl; 
        --idx;
    }
    cout << idx << ":" << a[idx] << endl; 

    return 0;
}

正如其他人指出的,C++语言规则没有定义从负数组索引中得到的期望值,因此编写编译器的人有权返回适合他们的任何值作为[-1 ]。他们唯一关心的可能是编写不会降低良好源代码性能的机器代码。

>当idx的值假定为18446744073709551615时,为什么上面的代码不给出分段错误

因为这个大数字是2**64-1,也就是说2提升到64次方,减去1

和数组索引逻辑有关,这与-- 1完全一样,因为2 ** 64值超出了64位硬件可以考虑的值。因此,您正在非法访问[-1],而您的计算机中恰好包含0

在您的记忆中,这是[0]前面的单词。它是堆栈中的内存,硬件完全允许您访问它,因此预计不会发生分段错误

while循环使用大小索引,它本质上是一个无符号的64位数量。因此,当索引递减并从0变为-1时,循环控制测试将-1解释为18446744073709551615一个由64位组成的位模式,所有位都设置为1,这远大于MAX_SZ=5,因此测试失败,while循环停止

如果对此有丝毫疑问,可以通过控制数组a[]周围的内存值进行检查。要做到这一点,您可以将数组a夹在两个较小的数组之间,例如magica和magicb,您可以正确地初始化它们。像这样:

#include <array>
#include <cstddef>
#include <iostream>
using std::array;
using std::size_t;
using std::cout;
using std::endl;

#define MAX_SZ 5

int main (void){

    array<int,2> magica; 

    array<int,MAX_SZ> a;
    size_t idx = MAX_SZ - 1;

    array<int,2> magicb; 

    magica[0] = 111222333;
    magica[1] = 111222334;

    magicb[0] = 111222335;
    magicb[1] = 111222336;

    cout << "magicb[1] : " << magicb[1] << endl;

    while (idx < MAX_SZ) {
        cout << idx << ":" << a[idx] << endl; 
        --idx;
    }
    cout << idx << ":" << a[idx] << endl; 

    return 0;
}

正如其他人指出的,C++语言规则没有定义从负数组索引中得到的期望值,因此编写编译器的人有权返回适合他们的任何值作为[-1 ]。他们唯一关心的可能是编写不会降低良好源代码性能的机器代码。

为什么上面的代码不给出分段错误,因为未定义的行为是未定义的。分段错误是由非法读或写内存访问引起的,例如,您试图写入文本部分或尝试
o访问未分配给程序的内存。看来你的内存访问不是非法的。数组可以读取和写入所有POGRAM的数据部分为什么会出现分段错误?如果可以安慰的话,在我的系统中,我得到的索引18446744073709551615超出了“int[5]类型的界限“。为什么上面的代码没有给出分段错误,因为未定义的行为是未定义的。分段错误是由非法的读或写内存访问引起的,例如,您试图写入文本部分或试图访问未分配给程序的内存。看来你的内存访问不是非法的。数组可以读取和写入所有POGRAM的数据部分为什么会出现分段错误?如果可以安慰的话,在我的系统上,我得到的索引18446744073709551615超出了“int[5]”类型的界限。
#include <array>
#include <cstddef>
#include <iostream>
using std::array;
using std::size_t;
using std::cout;
using std::endl;

#define MAX_SZ 5

int main (void){

    array<int,2> magica; 

    array<int,MAX_SZ> a;
    size_t idx = MAX_SZ - 1;

    array<int,2> magicb; 

    magica[0] = 111222333;
    magica[1] = 111222334;

    magicb[0] = 111222335;
    magicb[1] = 111222336;

    cout << "magicb[1] : " << magicb[1] << endl;

    while (idx < MAX_SZ) {
        cout << idx << ":" << a[idx] << endl; 
        --idx;
    }
    cout << idx << ":" << a[idx] << endl; 

    return 0;
}
magicb[1] : 111222336
4:607440832
3:0
2:4199469
1:0
0:2
18446744073709551615:111222336