关于指针访问越界的问题

北软夏老师 2012-07-06 08:24:56

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>


#define WFNSIZE 35
#define CLASIZE 4
#define CLASSNUM 300
#define TPSIZE 75
#define ENTRYSIZE 192429


//定义结构体用于存储文件名,以及文件类别
typedef struct WebFileNameNode
{
char wfname[WFNSIZE];
struct WebFileNameNode *next;
}WNode,*WebfNameList;

struct ClassificationLink
{
char webclass[CLASIZE];
WebfNameList wfn;
}classlink[CLASSNUM];


//处理字符数组函数,并将文件名和文件类别存入结构体
void deal( char *p)
{
char classtp[CLASIZE],wfntp[WFNSIZE];
WNode *node=NULL,*t=NULL;
int i,j,num=0;


//取出主题类号,并放入临时字符数组classtp
for (i=0,j=0;p[i]!=' '&&i<75;i++)
{
classtp[j]=p[i];
j++;
}
classtp[j]='\0';
i=i+3;

//取出文件名,并放入临时字符数组wfntp
for (j=0;p[i]!=' '&&i<75;i++)
{
wfntp[j]=p[i];
j++;
}
wfntp[j]='\0';
i=1;

//计算当前主题类号的整形表示
num=((int)classtp[i]-48)*100+((int)classtp[i+1]-48)*10+((int)classtp[i+2]-48);

node=(WebfNameList)malloc(sizeof(WNode));
node->next = NULL;
memset(node->wfname, 0, WFNSIZE);
strcpy(node->wfname,wfntp);

//将对应文件节点连入对应类链表
if (classlink[num].wfn==NULL)
{
strcpy(classlink[num].webclass,classtp);
classlink[num].wfn=node;
t=node;
}
else
{
t->next=node;
t=node;
}
t->next=NULL;
}


//构建文件类别和文件链表函数,将文件名结构体按序接在文件类别结构体后
void CreatWebNameList()
{
void deal(char *p);
FILE *fp;
int i,k;
char temp[TPSIZE];


//对由主题类号充当的链表头进行初始化
for (k=0;k<CLASSNUM;k++)
{
classlink[k].wfn=NULL;
}

if ((fp=fopen("BASELINE-D-C-1.txt","r"))==NULL)
{
printf("can not open file\n");
exit(0);
}

fgets(temp,TPSIZE,fp);
for (i=0; i<ENTRYSIZE; ++i)
{
memset(temp,0,TPSIZE);
fgets(temp,TPSIZE,fp);

deal(temp);
}

fclose(fp);
}


//匹配函数
void match()
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
char szDirPath[] = "E:\\material\\BASELINE-D-C-1-top1000contents\\";
char szNewPath[MAX_PATH];
char szFPath[MAX_PATH];
int i;
int flagnf[CLASSNUM];
WNode *p;

BOOL fFinished = FALSE;
BOOL cFinished = FALSE;

//初始化各类文件夹是否创建标记
for (i=0;i<CLASSNUM;i++)
{
flagnf[i]=1;
}

//在当前目录下搜索.htm文件
hSearch = FindFirstFile("*.htm", &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
printf("No .htm files found.");
}

//创建文件夹
if (!CreateDirectory(szDirPath, NULL))
{
printf("Couldn't create new directory.");
}

//对每个文件进行匹配并分类
while (!fFinished)
{
//逐个扫描每个类别链表
for (i=0;i<CLASSNUM;i++)
{
p=classlink[i].wfn;
while (p&&cFinished)
{
if (strcmp(p->wfname,FileData.cFileName)==0)
{
if (flagnf[i]!=0)
{
lstrcpy(szNewPath, szDirPath);
lstrcat(szNewPath, classlink[i].webclass);
if (!CreateDirectory(szNewPath, NULL))
{
printf("Couldn't create new directory.");
flagnf[i]=0;
}
}
lstrcpy(szFPath, szNewPath);
lstrcat(szFPath, FileData.cFileName);
if (CopyFile(FileData.cFileName, szFPath, FALSE))
{
cFinished = TRUE;
}
else
{
printf("Couldn't copy file.");
}
//优化:当匹配到对应文件后,将链表中的对应文件节点删除,将源文件删除;
}
else
{
p=p->next;
}
}
}

//提取下一个要匹配的文件信息
if (i==CLASSNUM&&cFinished==FALSE)
printf("Couldn't find find %s's class.",FileData.cFileName);
else if (!FindNextFile(hSearch, &FileData))
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
MessageBox(NULL, "No more .TXT files.",
"Search completed.", MB_OK);
fFinished = TRUE;
}
else
{
printf("Couldn't find next file.");
}
}
}

//关闭搜索控制
if (!FindClose(hSearch))
{
printf("Couldn't close search handle.");
}

}


//主函数
int main()
{
void CreatWebNameList();
void match();

CreatWebNameList();
match();
return 0;
}


程序编译成功,无法运行,运行时显示Access Violation;
调试过程中发现问题在deal函数与CreatWebNameList函数中,CreatWebNameList函数的最后一个循环只能运行一次,运行后,i的值变成一个很大的值,temp数组的内容变的和原来不一样了,而实际上只对它进行了一些扫描和复制,并没做任何修改。
BASELINE-D-C-1.txt文件的前几行是这样的:
<SYSDESC>baseline ranking without diversificaton, 1000 results</SYSDESC>
0001 0 bdf22ec256aa76d3-0e342a5d83eb28c0 0 25.9333 BASELINE-D-C-1
0001 0 1a7e081634c5d53a-d539257fc6b43e00 1 25.5223 BASELINE-D-C-1
0001 0 b4187f10e8cad8e2-49187010c6530ff0 2 24.996 BASELINE-D-C-1
0001 0 570b35cc83a76b6c-fb1ac9cc51c1c180 3 24.6609 BASELINE-D-C-1
0001 0 1bd229f3e16d6f75-135c1c5bf7e10380 4 24.5833 BASELINE-D-C-1
0001 0 63667428f9d2ea6e-6e4edff4c7e54840 5 24.4385 BASELINE-D-C-1
0001 0 c5ae914b028a972e-5aa07783d4cca6e0 6 24.368 BASELINE-D-C-1
0001 0 26e8e35866f35fff-879d661f1d301200 7 24.2006 BASELINE-D-C-1
0001 0 342448455f20318f-c470c1e3407b54e0 8 24.1456 BASELINE-D-C-1
0001 0 5e8ef0a8ab30bf1e-4fe07783d4cca6e0 9 23.9192 BASELINE-D-C-1
0001 0 d8620eb8e77f6304-fad6438462160850 10 23.9184 BASELINE-D-C-1
0001 0 567c7286de22e285-806230e995aaf7e0 11 23.8811 BASELINE-D-C-1
0001 0 31e2e6964430bf1e-4fe07783d4cca6e0 12 23.7167 BASELINE-D-C-1
0001 0 47b769b303e4f13f-fdade6c523886860 13 23.6915 BASELINE-D-C-1
0001 0 7a12d1edd0359630-56907783d4cca6e0 14 23.612 BASELINE-D-C-1
0001 0 990fe715004fa12f-5c2f923146489270 15 23.6092 BASELINE-D-C-1
0001 0 ad3f8d3f14cc765d-1252489e2e991640 16 23.5768 BASELINE-D-C-1
0001 0 8d152176c7a76b6c-fb1ac9cc51c1c180 17 23.4633 BASELINE-D-C-1
0001 0 21e448be52f88189-0c3d2ee342ffb6d0 18 23.4544 BASELINE-D-C-1
0001 0 8e626499ad6f56e2-8790ee4664f10d40 19 23.3408 BASELINE-D-C-1
0001 0 44f87c79f7759c9c-92c5c177ab6cc660 20 23.2791 BASELINE-D-C-1
0001 0 08b24b895ee44cd4-2c45d9a362314a50 21 23.2482 BASELINE-D-C-1
0001 0 d39e7ddba657edd4-dcc2cfc17b605c30 22 23.1531 BASELINE-D-C-1
0001 0 39c8f2a296c5d53a-d539257fc6b43e00 23 23.1235 BASELINE-D-C-1
0001 0 f47c9c1fdd838710-f010c1e3407b54e0 24 22.9169 BASELINE-D-C-1
0001 0 976b7f6e229bd629-c356438462160850 25 22.8325 BASELINE-D-C-1
0001 0 e1f887f59e03cb73-18c047588ca53b00 26 22.8262 BASELINE-D-C-1
0001 0 03001c272484c49c-0f94ab7f4fb5e370 27 22.8108 BASELINE-D-C-1
0001 0 c0f36d095817da6c-c66d9e46b8d58490 28 22.6789 BASELINE-D-C-1
0001 0 51199e5576618562-526c9207854d7190 29 22.6344 BASELINE-D-C-1
0001 0 ae9002827503cb73-18c047588ca53b00 30 22.5901 BASELINE-D-C-1
0001 0 c396d9af7bc8a4c8-61a44679165c4ed0 31 22.5219 BASELINE-D-C-1
0001 0 1e8c1ea1f164b347-cdd117003bfce7b0 32 22.4805 BASELINE-D-C-1
0001 0 0e8ca3c1b6cc765d-1252489e2e991640 33 22.448 BASELINE-D-C-1
0001 0 546740271d618562-526c9207854d7190 34 22.4157 BASELINE-D-C-1
0001 0 30937f74f7e263fd-fab6950b6a56b350 35 22.2937 BASELINE-D-C-1
0001 0 ebd6839e773f4d08-d8bdf9789619ba30 36 22.2509 BASELINE-D-C-1
0001 0 6074ef01bae178c0-53a0ee4664f10d40 37 22.245 BASELINE-D-C-1
0001 0 c063fe8692730b50-a56f7c2740946b80 38 22.2325 BASELINE-D-C-1
0001 0 2e30155e84243b08-f7f2d54aa3c55650 39 22.1484 BASELINE-D-C-1
0001 0 f0127ef8a3838710-f010c1e3407b54e0 40 22.1429 BASELINE-D-C-1
0001 0 56458a716e8a972e-5aa07783d4cca6e0 41 22.1196 BASELINE-D-C-1
0001 0 381aa3fc1fe263fd-fab6950b6a56b350 42 22.0922 BASELINE-D-C-1
0001 0 97c354903f7cc901-956047588ca53b00 43 22.0873 BASELINE-D-C-1
0001 0 6bf03453ab4acd89-3da25073347c2d50 44 22.0862 BASELINE-D-C-1
0001 0 58b197652d5f6c53-82316da6ac3f2840 45 22.036 BASELINE-D-C-1
0001 0 f3da427bcc995f70-fc75405f0ad94ef0 46 22.0295 BASELINE-D-C-1
0001 0 49bd9b98a16989d3-b9ca53807f53de30 47 22.0063 BASELINE-D-C-1
0001 0 985a855f781426f6-3e3d0ac698119050 48 21.9574 BASELINE-D-C-1
希望帮忙看下问题的症结究竟在哪儿。
这个程序是用C和C++写的,因为我不太会C++所以程序的部分功能只好用C实现,而我的C也最多刚入门,所以代码以及算法可能让朋友们看着难受,但希望多多包涵吧。
...全文
488 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
北软夏老师 2012-07-06
  • 打赏
  • 举报
回复
你说的这个我记得不大清楚,回头查一下,不过应该和这个没关系。呵呵,大家一起交流,学习嘛,有什么好见笑的。
阿佳夕 2012-07-06
  • 打赏
  • 举报
回复
哈哈,我也是新手,不过我是学C++的,没怎么接触过C.代码太长了估计没有多少人愿意看,本来我想拿来调一下看看的,结果你用了个windows.h头文件,那我这个linux系统就无能为力。代码那么长,我也没细看(关键是水平不怎么的,光看很难找出毛病來)。不过我看了下int main()函数,发现在main函数里面你又重新对
void CreatWebNameList();
void match();
函数声明了一次,这样有什么用呢?是不是应该把void去掉啊。我也是个新手啊,如果说的不对,不要见笑了。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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