【问题标题】:Using memcpy is causing overwrite of memory to NULL使用 memcpy 导致将内存覆盖为 NULL
【发布时间】:2011-12-06 14:10:41
【问题描述】:

memcpy 的问题

使用 Eclipse CDT 处理 C 项目

最奇怪的事情正在发生! 当我调试时,我看到 iu1 值在 for 循环中的两次迭代后被覆盖。

我现在已经编辑了这个问题。

请看下面的代码。

typedef struct IUnitStruct
{
    long ptr;
    char key[1];
}iUnit;





void createInternalNode(internalNode ** n)

{

        int iUnitSizeJump = 1012 ;
        iUnit* iu1 = (iUnit*) malloc(iUnitSizeJump);
        iu1->ptr = -1;
        strcpy(iu1->key,"NullKey1");    

        iUnit* iu2 = (iUnit*) malloc(iUnitSizeJump);
        iu2->ptr = -2;
        strcpy(iu2->key,"NullKey2");

        for (int i = 0 ; i < 8; i=i+2 )
        {
            memcpy(&(*n)->iunit[(i)*(iUnitSizeJump)],iu1,iUnitSizeJump);
            memcpy(&(*n)->iunit[(i+1)*(iUnitSizeJump)],iu2,iUnitSizeJump);
        }
    }   



void printNode(internalNode *n, int iUnitSize)
{

    for (int i = 0 ; i < 8; i++ )

    {

        cout << "||Page:" ;

        cout << n->iunit[i*iUnitSize].ptr;

        cout << "|";

        cout << n->iunit[(i*iUnitSize)].key;

        cout << "|| ";

    }


}

这是输出

||Page:-1|NullKey1||

||Page:-2|NullKey2|| 

||Page:0||| 

||Page:-2|NullKey2|| 

||Page:0||| 

||Page:-2|NullKey2||

||Page:0|||

||Page:-2|NullKey2|| 

我需要它显示

||Page:-1|NullKey1||

而不是

||Page:0|||

【问题讨论】:

  • 严重建议:停止使用 C/C++,它真的不存在。只有 C 和另一种名为 C++ 的语言。一旦你开始正确使用 C++,你就不会再遇到这类问题了。
  • n和n-&gt;iunit的定义是什么?
  • iUnitSizeJump 的目的是什么?乍一看,您可能想要访问元素 iunit[i]、iunit[i+1],而不是使用那个乘数。
  • 什么是n?你能提供更多细节吗?
  • 您的代码充满了缓冲区溢出。当您尝试将 strcpy() 数据写入 structs Key 时,首先 malloc() 具有字符串所需的适当大小的 char[] (它会非常快地衰减为指针)。您可以使用 strlen() 来获取字符串大小。然后 malloc(sizeof(char) * strlen(stringToCopy));为您的字符串保留免费商店的空间。这只是一个开始.. 如果您的数据结构索引超出数据结构的大小(另一个缓冲区溢出)... .. sighs ..

标签: c linux gcc memcpy


【解决方案1】:

我发现至少有两个潜在问题:

  • 如果(*n)-&gt;iunit 没有预先分配至少8 * iUnitSizeJump 的内存,memcpy() 将会不高兴
  • iu1 和 iu2 未初始化(malloc() 未初始化),因此您会将未初始化的内存复制到 (*n)-&gt;iunit。这不会导致程序崩溃,但是由于您的 memcpy() 您会得到半随机的东西,这将导致每次运行都可能不同 - 可能不是您的意图。

【讨论】:

  • 任何未初始化的数据都超过了空终止字符串中的终止符,因此不应该有任何影响。
  • 我的分配正好是 iUnitSize 的 8 倍,并且结构中的值自动设置为零。我认为CPP会这样做。然而问题仍然存在,我不得不让ui1, if I have another unit, ui3` 与ui1 具有相同的值,并用ui3 而不是ui1 替换第一个memcpy 语句,它工作得很好但我不能取消@987654330 @malloc 声明。不明白为什么。
  • @JuzzJan191 CPP 只为每个结构分配 1 个字符。您在该内存地址中填充了超过 1 个字符。使用 new 或 malloc 为 memcpy 分配所需的适当空间
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2012-11-01
  • 1970-01-01
  • 2018-07-21
相关资源
最近更新 更多