C memcpy错误 - 无法在Windows XP上写入内存

时间:2010-08-23 13:04:22

标签: c string gcc windows-xp memcpy

我有一个C程序,它逐行将文件加载到一个字符串中,然后使用此代码将此字符串memcpy转换为另一个字符串指针:

   typedef struct inmod_struct {
       Int32 ReturnCode;
       Int32 Length;
       char  Body[ROWSIZE];
    } inmdtyp,*inmdptr;

    inmdptr inmodptr;
    char line[600];
    int doit()
    {
        char *p;
        p = inmodptr->Body;
        ReadFile();  //reads a line of the file into **line** string variable


    memcpy(p, line, strlen(line));
    p += strlen(line);

    inmodptr->ReturnCode = 0;
    inmodptr->Length = p - inmodptr->Body;

    reccnt++;
}

但是当我在Windows XP SP3机器上执行上述程序时,我收到一个错误消息框说:

  

“< memory address>”处的说明在“< memory address>”处引用了内存。内存无法“写入”。单击“确定”以终止....

当我尝试进行类似的内存操作时,我遇到了类似的问题。 strcpy最适合我,但strcpy省略读取直到行的NUL字符,但即使在行中的NUL之后我还会读取更多字符。任何人都可以为此提供解决方法或任何灵魂。

环境:Windows XP SP3,GCC编译器。

我甚至在solaris unix上尝试过类似的代码编译和使用,我在那里遇到了同样的问题。

我也遇到过类似的错误,其中包括一些OpenCV Python,C样本。

修改 对不起伙计..我有指针p初始化p = inmodptr->Body; inmodptr是一个结构。我可以确认指针初始化不是问题。发布完整代码以保持清晰

2 个答案:

答案 0 :(得分:2)

您需要分配缓冲区并让p保存该缓冲区的地址。然后你可以像你一样使用p

指针是保存内存地址的变量。你的指针包含一些未初始化的值,可能没有指向有效的内存地址。

char *p = malloc(strlen(line) + 1);

如果要存储字符串,则额外的+1用于NULL终止的字符\0。如果由于某种原因使用memcpy而不是strcpy,则必须手动为NULL终止缓冲区。

此外,如果malloc完成后使用free,请确保p。您也可以简单地堆叠分配一个字符数组,并使用它来代替{{1}}。

答案 1 :(得分:0)

这一行:

inmdptr inmodptr;

声明指针inmodptr,但不初始化它 - 它指向一些随机存储位置。

您需要将其指向可以容纳struct inmod_struct对象的实际实例的位置 - 例如:

inmdtyp inmod;
inmdptr inmodptr = &inmod;