【问题标题】:c++ memory mess in arrays数组中的c ++内存混乱
【发布时间】:2016-01-21 20:07:26
【问题描述】:

为什么会这样?

u_char macDst[6], macSrc[6], ipType[2]={0x88, 0x92};
u_char header[] = {0x04,0x00,0x20,0x00,...,};
const int len = sizeof(macDst) + sizeof(macSrc) + sizeof(header) + 2;
u_char* pck[len];

int j = 0, length = sizeof(macDst);
for (j; j < length; j++)
{
    pck[j] = &macDst[j];
}
length += sizeof(macSrc);

for (j; j < length; j++)
{
    pck[j] = &macSrc[j - sizeof(macDst)];
}

pck[j++] = &ipType[0];
pck[j++] = &ipType[1];

length += sizeof(header) + 2;

for (j; j < len; j++)
{
    pck[j] = &header[j - sizeof(macDst) - sizeof(macSrc)];
}
u_char testSend[170];

memcpy(testSend, *pck, sizeof(pck));

var testSend 只有 macDst 值(在初始化之前),而在指针中我拥有所有这些值。如果我一个一个地复制它们,我会得到一个很好的结果:

for (int k = 0; k < 170; k++)
{
    testSend[k] = *pck[k];
}

有什么想法吗??

谢谢!!

编辑:

这是一个物理问题:

-----ooooooooo------------aaaa----bbbb----
- Null Data

当我创建指针数组时,我正在这样做:

oooooooooaaaabbbb

但是当我发送数据包并执行 memcpy(或 memmove)时,我是这样说的:获取这个指针和这个内存量并复制它们:

----|oooooooooo----------|----aaaaa----bbbb----

是三个内存位置的总和。

【问题讨论】:

  • pck 是指向u_char指针 数组,这对我来说似乎是错误的。如果它是u_char 的数组并且您将所有单个字节而不是指针复制到它会更有意义,因为将一系列进程私有指针发送到其他地方(尤其是通过我猜你的网络)做)只是没有意义。
  • 您对memcpy 的调用是错误的,您将指针数组的一部分复制到testSend,而不是指针指向的内容。
  • 是的,这是针对网络的,但是:是的,这没有任何意义,因为我的想法是独立创建标头数组,然后将它们的指针加入指针数组中。我明白了,因为当我翻过它时,我看到了所有这些。问题可能是这样的: -----ooooooo----------------------------oooooooo--------ooooooooo (- null) (o data) 当我将它们加入数组时,我可以访问所有排序的,但是,当我这样做时(memcpy),我是说,获取这个指针并复制这个内存量:170:- |ooooooooo------------|------oooooo-------oooooooo 我正在接受|这些价值观|
  • “数组中的内存混乱” - 不幸的是,这很常见。请改用std::stringstd::vector,甚至使用std::array

标签: c++ arrays memory


【解决方案1】:

我发现代码很复杂,我永远不会这样写。不过,这里的错误:

memcpy(testSend, *pck, sizeof(pck));

您正在取消引用pck - 并指向第一个元素,即char*。这是您使用 memcpy 复制的内容。另一方面,您的手写循环确实在复制指针之前取消引用它。

【讨论】:

  • @JoachimPileborg,这是对我的格式化。它使用 * 我在 char 之后将文本转换为斜体!
【解决方案2】:

直接填充testSend数组:

u_char *p = testSend;
memcpy(p, macDst, sizeof(macDst)); p += sizeof(macDst);
memcpy(p, macSrc, sizeof(macSrc)); p += sizeof(macSrc);
memcpy(p, ipType, sizeof(ipType);  p += sizeof(ipType);
memcpy(p, header, sizeof(header));

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多