我有一个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是一个结构。我可以确认指针初始化不是问题。发布完整代码以保持清晰
答案 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;