0

我有一个 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 机器上执行上述程序时,我收到一个错误消息框,上面写着:

“<内存地址>”处的指令引用了“<内存地址>”处的内存。内存无法“写入”。单击确定终止....

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

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

我什至在 solaris unix 上尝试过类似的代码编译和使用,我在那里面临同样的问题。

我在一些 OpenCV Python、C 示例中也遇到了类似的错误。

编辑: 对不起,伙计们..我有那个指针 p 初始化p = inmodptr->Body;inmodptr 是一个结构。我可以确认指针初始化不是问题。为了清楚起见,发布了完整的代码

4

2 回答 2

2

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

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

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

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

此外,如果你malloc确定free一旦你完成使用它。您也可以简单地堆栈分配一个字符数组并使用它而不是p.

于 2010-08-23T13:07:20.780 回答
0

这一行:

inmdptr inmodptr;

声明一个指针inmodptr,但没有初始化它——它指向某个随机内存位置。

您需要将其指向可以保存struct inmod_struct对象实际实例的某个位置 - 例如:

inmdtyp inmod;
inmdptr inmodptr = &inmod;
于 2010-08-23T13:08:39.633 回答