求大神帮忙看个C语言指针的问题

v2psv 2013-10-13 09:32:40
调试出错代码如下:0x75E53976 (kernel32.dll) (Password.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0xCDCDCDD1 时发生访问冲突。
我查了很多地方,都说是指针的问题,但是我实在找不到错误,求各位帮忙看看,谢谢了!

while(!feof(file))
{
fwscanf(file, L"%s", string_in);
if(HEAD == NULL)
{
p = (LinkHead *)malloc(sizeof(LinkHead));
HEAD = p;
p->firstnode = (PassLink *)malloc(sizeof(PassLink));
lstrcpy(p->Category, string_in);
p->length = 1;
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->WebName, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->UserName, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->PassWord, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->WebSite, string_in);
p->lastnode = p->firstnode;
}
else
{
for(p = HEAD; p != NULL; p = p->nextHead)
{
if (lstrcmp(p->Category, string_in) == 0) //就是这句提示出错的
{
p->lastnode->nextnode = (PassLink *)malloc(sizeof(PassLink));
p->lastnode = p->lastnode->nextnode;
fwscanf(file, L"%s", string_in);
lstrcpy(p->lastnode->WebName, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->lastnode->UserName, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->lastnode->PassWord, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->lastnode->WebSite, string_in);
p->length++;
break;
}
else continue;
}
if(p == NULL)
{
p = (LinkHead *)malloc(sizeof(LinkHead));
lstrcpy(p->Category, string_in);
p->firstnode = (PassLink *)malloc(sizeof(PassLink));
p->length = 1;
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->WebName, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->UserName, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->PassWord, string_in);
fwscanf(file, L"%s", string_in);
lstrcpy(p->firstnode->WebSite, string_in);
p->lastnode = p->firstnode;
}

}
}
...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-10-14
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
赵4老师 2013-10-14
  • 打赏
  • 举报
回复
可以参考这个帖子里面我的代码。 http://bbs.csdn.net/topics/390614232
xiaoyao18301 2013-10-14
  • 打赏
  • 举报
回复
数组b[11]在使用之前做好初始化工作
v2psv 2013-10-14
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
谢谢,我试试看
v2psv 2013-10-13
  • 打赏
  • 举报
回复
自己顶下,希望能有大神帮忙解决。。
v2psv 2013-10-13
  • 打赏
  • 举报
回复
这是定义的结构体和指针类型

typedef struct passlink{
	TCHAR WebName[100];
	TCHAR UserName[100];
	TCHAR PassWord[100];
	TCHAR WebSite[100];
	struct passlink* nextnode;
}PassLink;

typedef struct linkhead{
	int					length;
	TCHAR				Category[100];
	PassLink			*firstnode;
	PassLink			*lastnode;
	struct linkhead		*nextHead;
}LinkHead;

LinkHead	*p;
LinkHead	*HEAD;
一、Go语言的由来      Go语言亦叫Golong语言,是由谷歌Goggle公司推出。Go语言的主要开发者有:肯.汤姆逊(Ken Thompson)、罗布.派克(Rob Pike)和罗伯特.格里泽默(Robert Griesemer)。这三个都是大神,稍介绍一下他们的贡献:     肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx发明人,B语言作者(C语言前身),还做飞行员,后来被谷歌挖走。     罗布.派克(Rob Pike):Unix团队和Plan 9操作系统计划的成员,与Ken老爷子共事多年,并共创出广泛使用的UTF-8 字元编码。     罗伯特.格里泽默(Robert Griesemer):曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。     膜拜一下大神的容颜:Ken老爷子(左),Rob Pike(右)         二、开发Go语言的初衷     根据Go语言开发者自述,近10多年,从单机时代的C语言到现在互联网时代的Java,都没有令人满意的开发语言,而 C++往往给人的感觉是,花了100%的经历,却只有60%的开发效率,产出比太低,Java和C#的哲学又来源于C++。并且,随着硬件的不断升级,这些语言不能充分的利用硬件及CPU。因此,一门高效、简洁、开源的语言诞生了。 三、Go语言的特点    Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go = C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。 Go语言有以下特性: 1.自动垃圾回收     C/C++最头疼的就是指针问题,一不小心就野指针了或者又越界了。在Go语言里再也不用担心,也不用考虑delete或者free,系统自动会回收。 2.函数可以返回多个值     这个很神奇,大多数语言只能返回一个值,Go语言可以返回多个值。这个功能使得开发者再不用绞尽脑汁的想到底怎么返回值的设计,也不用为了传值专门定义一个结构体。 3.并发编程     Go语言天然并发,只需要关键字“go”就可以让函数并发执行,使得并发编程变得更为简单,这也是Go语言最大的优势。 四、Go语言能做什么开发     Go语言是非常有潜力的语言,是因为它的应用场景是目前互联网非常热门的几个领域,比如区块链开发、大型游戏服务端开发、分布式/云计算开发。像Goggle、阿里、京东等互联网公司都开始用Go语言开发自己的产品。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧