C++ c++;阵列拷贝,解决问题

C++ c++;阵列拷贝,解决问题,c++,memory,dynamic-arrays,C++,Memory,Dynamic Arrays,我在迭代数组时遇到了一些内存问题。这是我的密码: ... std::vector<uint32_t> iD(32); packBytes(intialPad.data(), intialPad.size(), iD); const char32_t* modifiedInitPad = iD.data(); uint32_t H[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c

我在迭代数组时遇到了一些内存问题。这是我的密码:

...
std::vector<uint32_t> iD(32);
packBytes(intialPad.data(), intialPad.size(), iD);
const char32_t*  modifiedInitPad = iD.data();
uint32_t H[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
...

for (uint32_t i = 0; i < 2; i++)
{

        uint32_t block[16];
        std::copy(modifiedInitPad + (i * 16), modifiedInitPad + (i * 16 ) + 16, block);


        uint32_t w[64];

        uint32_t temp[10];

        transformBlock(block, w, temp, H);

}

...

void transformBlock(uint32_t* block, uint32_t* W, uint32_t* temp, uint32_t* H) { 
   const uint32_t K[] = {
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};

const uint32_t size = 16;

for (int i = 0; i < size; i++)
{
    W[i] = block[i];
}
for (int t = 16; t < 64; ++t)
    W[t] = crypto::f6(W[t - 2]) + W[t - 7] + crypto::f5(W[t - 15]) + W[t - 16];

for (int i = 0; i < 8; i++)
{
    temp[i] = H[i];
}


for (int t = 0; t < 64; ++t) {
    temp[8] = temp[7] + crypto::f4(temp[4]) + crypto::f1(temp[4], temp[5],  temp[6]) + K[t] + W[t];
    temp[9] = crypto::f3(temp[0]) + crypto::f2(temp[0], temp[1], temp[2]);
    temp[7] = temp[6];
    temp[6] = temp[5];
    temp[5] = temp[4];
    temp[4] = temp[3] + temp[8];
    temp[3] = temp[2];
    temp[2] = temp[1];
    temp[1] = temp[0];
    temp[0] = temp[8] + temp[9];
}
for (int i = 0; i < size; i++)
{
    H[i] = crypto::add(H[i], temp[i]);
}
}
...
namespace crypto {
namespace {
    uint32_t word(int a, int b, int c, int d)  {
        a &= 0xff;
        b &= 0xff;
        c &= 0xff;
        d &= 0xff;
        int val = a << 24 | b << 16 | c << 8 | d;
        return val;
    }

    uint32_t ROTR(uint32_t number, unsigned bits)   {
        return (number >> bits) | (number << (32 - bits));
    }

    uint32_t f1(uint32_t x, uint32_t y, uint32_t z)  {
        return (x & y) ^ (~x & z);
    }
    uint32_t f2(uint32_t x, uint32_t y, uint32_t z)   {
        return (x & y) ^ (x&z) ^ (y&z);
    }
    uint32_t f3(uint32_t x)  {
        return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22);
    }
    uint32_t f4(uint32_t x)  {
        return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25);
    }
    uint32_t f5(uint32_t x)  {
        return ROTR(x, 7) ^ ROTR(x, 18) ^ (x >> 3);
    }
    uint32_t f6(uint32_t x)  {
        return ROTR(x, 17) ^ ROTR(x, 19) ^ (x >> 10);
    }

    uint32_t add(uint32_t a, uint32_t b) {
        return a + b;
    }
}
}
。。。
std::向量iD(32);
包字节(intialPad.data(),intialPad.size(),iD);
常量char32_t*modifiedInitPad=iD.data();
uint32_t H[8]={0x6a09e667、0xbb67ae85、0x3c6ef372、0xa54ff53a、0x510e527f、0x9b05688c、0x1f83d9ab、0x5be0cd19};
...
对于(uint32_t i=0;i<2;i++)
{
uint32_t块[16];
标准:复制(modifiedInitPad+(i*16),modifiedInitPad+(i*16)+16,块);
uint32_t w[64];
uint32温度[10];
转换块(块,w,温度,H);
}
...
无效转换块(uint32_t*block,uint32_t*W,uint32_t*temp,uint32_t*H){
const uint32_t K[]{
0x428a2f98、0x71374491、0xb5c0fbcf、0xe9b5dba5、,
0x3956c25b、0x59f111f1、0x923f82a4、0xab1c5ed5、,
0xd807aa98、0x12835b01、0x243185be、0x550c7dc3、,
0x72be5d74、0x80deb1fe、0x9bdc06a7、0xc19bf174、,
0xe49b69c1、0xefbe4786、0x0fc19dc6、0x240ca1cc、,
0x2de92c6f、0x4a7484aa、0x5cb0a9dc、0x76f988da、,
0x983e5152、0xa831c66d、0xb00327c8、0xbf597fc7、,
0xc6e00bf3、0xd5a79147、0x06ca6351、0x14292967、,
0x27b70a85、0x2e1b2138、0x4d2c6dfc、0x53380d13、,
0x650a7354、0x766a0abb、0x81c2c92e、0x92722c85、,
0xa2bfe8a1、0xa81a664b、0xc24b8b70、0xc76c51a3、,
0xd192e819、0xD690624、0xf40e3585、0x106aa070、,
0x19a4c116、0x1e376c08、0x2748774c、0x34b0bcb5、,
0x391c0cb3、0x4ed8aa4a、0x5b9cca4f、0x682e6ff3、,
0x748f82ee、0x78a5636f、0x84c87814、0x8cc70208、,
0x90BEFFA、0xa4506ceb、0xbef9a3f7、0xc67178f2
};
const uint32_t size=16;
对于(int i=0;i>10);
}
uint32\u t添加(uint32\u t a、uint32\u t b){
返回a+b;
}
}
}
当i=0时,一切顺利。但当i=1时,modifiedInitPad的地址与前面的地址不同。所以我在“std:copy(…)”得到一个例外


有什么想法吗?

在下面的循环中,可能会出现缓冲区溢出

 for (int i = 0; i < size; i++)
{
     H[i] = crypto::add(H[i], temp[i]);
for(int i=0;i

大小是16,因为H应该是一个使用H[i]的8元素数组,所以当
i
1
时,会导致i=8和9的溢出,所以您不复制任何内容。当
i
2
时,您会遇到问题,因为32大于16。
std::copy(x+32,x+16,…)
需要修复,正如juan所说,我的复制/粘贴错误。我已经编辑了内容。如果我在“transformBlock(block,w,temp,H);”之后放置断点,modifiedInitPad的地址将更改。我们必须查看transformBlock的源代码。如果在堆栈上进一步声明了H,则可能您正在编写超出其边界的内容(一直到modifiedInitPad的内存中)。我用更多的代码编辑了内容:-)正如我前面所说,这是一个错误的复制/粘贴。问题是在“transformBlock”之后。modifiedInitPad的地址被修改了。