vc6中,同时使用memcpy 和 CString 时编译通过,但程序报错!???

来源:百度知道 编辑:UC知道 时间:2024/05/17 22:11:39
typedef struct struct_ZHPMDATA
{
char Stockid[6];
DWORD a;
}ZHPMDATA;
char tempid[6];
ZHPMDATA pdat[300];
CString str;
memcpy(tempid,pdat[j]->Stockid);//到这没错
str.Format("%d",pdat[j]->a);//紧接着到这就报错了

编译能通过,是程序运行的时候,报告C00005错误,也就是内存访问违规
换成strcpy一样报错

有什么解决的办法吗?
ZHPMDATA pdat[300];
这个地方是我搞错了,应该是 ZHPMDATA *pdat[300];//激动了,少打了个*号

应该是memcpy(tempid,pdat[j]->Stockid,strlen(tempid));
我开始使用的strcpy,所以没有strlen,提问的时侯改成memcpy,就把后边的字串大小忘记了。

另外 这段代码不存在地址越界的。如果有兴趣,你们可以自己试一下这个情况
就是 先用 memcpy 再用 CString 一起访问同一个结构中的变量,肯定报错。。。。。。

访问越界的可能性非常大,你把strlen() ,改成 sizeof()试试。
或者试试这段代码:
typedef struct struct_ZHPMDATA
{
    char Stockid[6];
    DWORD a;
}ZHPMDATA;

int j=0;
char tempid[6];
ZHPMDATA pdat[300];
strcpy(pdat[0].Stockid, "abcde");
pdat[0].a=1;
CString str;
memcpy(tempid,pdat[j].Stockid, sizeof(tempid));
str.Format("%d",pdat[j].a);

memcpy(tempid,pdat[j]->Stockid);//到这没错
str.Format("%d",pdat[j]->a);//紧接着到这就报错了

可能是你的指针越界了吧?你的代码不完整,我看不到j变量的相关代码,所以只能猜测一下。

也许你会问指针越界,为什么第一句不会出错呢?
这是因为第一句只有读操作,对一个错误的指针进行读操作,一般不会出错,但是读到的数据却是错误的。

解决方法是:弄个断点,看j变量是否 0 <= j <= 299

typedef struct struct_ZHPMDATA
{
char Stockid[6];
DWORD a;
}ZHPMDATA;

ZHPMDATA pdat[300];

这个 pdat[j] 是指针吗?怎么用 pdat[j]->Stickid ?
是不是该用 pdat[j].Stickid ?
高手指点下。

memcpy(tempid,