相关疑难解决方法(0)

将一维数组重新整形为多维数组

考虑到整个C++ 11标准,任何符合要求的实现是否有可能成功完成下面的第一个断言,但后者失败了?

#include <cassert>

int main(int, char**)
{  
    const int I = 5, J = 4, K = 3;
    const int N = I * J * K;

    int arr1d[N] = {0};
    int (&arr3d)[I][J][K] = reinterpret_cast<int (&)[I][J][K]>(arr1d);
    assert(static_cast<void*>(arr1d) ==
           static_cast<void*>(arr3d)); // is this necessary?

    arr3d[3][2][1] = 1;
    assert(arr1d[3 * (J * K) + 2 * K + 1] == 1); // UB?
}
Run Code Online (Sandbox Code Playgroud)

如果不是,这在技术上是不是UB,并且如果第一个断言被删除,那么答案是否会改变(reinterpret_cast保证在这里保留地址?)?另外,如果重塑是在相反方向(3d到1d)或从6x35阵列到10x21阵列完成的,该怎么办?

编辑:如果答案是因为这是UB reinterpret_cast,是否还有一些其他严格遵守的重塑方式(例如,static_cast来自/来自中间人void *)?

c++ multidimensional-array language-lawyer c++11

15
推荐指数
1
解决办法
3907
查看次数

对于数组来说,std :: array转换的C-Style数组是否完全安全?

第一次提问者:)是否有可能在不破坏代码的情况下将全局c样式数组转换为std :: arrays?我正在开发一个项目,其中包括反编译旧游戏的源代码.我们已经设法重构了反汇编/反编译输出的大部分内容.因为它是自动的,所以仍然有像

  int a;
  int b[50];
  *(&a + 100) = xxx;
Run Code Online (Sandbox Code Playgroud)

要么

  int b[50];
  int a;
  *(&a - 100) = xxx;
Run Code Online (Sandbox Code Playgroud)

还有其他类型的疯狂指针算术,它们尚未手动重构.但我们想使用边界检查已经(可能)正确更改为数组的部分.

(忽略斜体文本,我只是为了保持评论的一致性)到目前为止,我发现每个数组都有一个问题:sizeof(class containing array)会改变.这可能会在某些周期中破坏代码,例如someclass somearray [100]; //例如(sizeof(somearray [0])== 50)是真的int指针=(int)somearray; 指针+ = 100((someclass)指针) - > doSomething(); .因为pointer +=100不是指向第二个元素,而是指向第一个元素,或者甚至是第0个元素,我不确定(不要忘记它是自动反编译的代码,因此是丑陋的).

我正在考虑将每个全局数组更改为std :: array以及在没有[]运算符的情况下访问数组的每个实例array._Elems.

如果我要在这样的代码中将全局数组更改为std :: arrays,是否会出现任何问题?

编辑 你是对的,大小不变.我在测试功能中出错了.所以我会扩展这个问题:

将每个c样式数组更改为std :: array是否安全?

编辑 我们当前的代码实际上只能在调试模式下运行,因为它不会移动变量.发布模式基本上在程序开始时崩溃.

编辑 因为这个问题似乎有些混乱,让我澄清一下:除了T elems [N]之外,是否有一些保证阵列中没有其他成员?我能指望拥有

array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10
Run Code Online (Sandbox Code Playgroud)

varname[1][0] …

c++ arrays disassembly c++11 stdarray

15
推荐指数
1
解决办法
2966
查看次数

初始化类型为枚举类的二维std ::数组(C++ 11)

我在C++ 11中有以下类:

class MyTable
{
    public:
    enum class EntryType
    {
        USED, FREE
    };

    MyTable(EntryType value)
    {
        for (uint32_t i = 0; i < 10; ++i)
        {
            memset(_table[i].data(), (int)value, sizeof(_table[0][0]) * 50);
        }
    }
    array<array<EntryType, 50>, 10> _table;
}
Run Code Online (Sandbox Code Playgroud)

尝试使用EntryType :: FREE的值构造MyTable的对象,二维数组中的每个项的值都为0x01010101(每8位1b),而不是仅为0x1的预期值

我猜它与我的value被投入有关int,但我不知道为了解决这个问题我应该做些什么.

c++ initialization c++11 enum-class stdarray

7
推荐指数
1
解决办法
785
查看次数

我可以使用指针访问多维数组吗?

这个引用,在C中,似乎以下行为是未定义的.

int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
Run Code Online (Sandbox Code Playgroud)

C++ 03或C++ 11中是否有引用证实了这一点?

c++ arrays pointers multidimensional-array

4
推荐指数
1
解决办法
788
查看次数