求高手帮看下这段代码有什么问题

lirg8405 2009-12-12 10:51:55
void GetNext(const char *Str,int *next)
{
int j=0, k=-1;
int len = strlen(Str);
next[0] = -1;
while(j < len)
{
if (k==-1 || Str[j] == Str[k])
{
j++;
k++;
next[j] = k;
}
else k = next[k];
}
}
char *q = "abcaa";
int next[5];
GetNext(q,next); //调用后,q值发生变化了,为什么?
...全文
128 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lirg8405 2009-12-12
  • 打赏
  • 举报
回复
结了,谢谢各位大哥、大姐
lirg8405 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mstlq 的回复:]
引用 7 楼 lirg8405 的回复:
引用 4 楼 mstlq 的回复:
请勿试图修改字符常量区的数据……
C/C++ codechar q[]="abcaa";

???那里修改了?我有点菜,没看出来...


抱歉,看得不够仔细……
楼主的原因是……
j==len的时候,即j=5的时候,
访问了next[5],数据越界了
[/Quote]
对了,就是这原因了,太谢谢了
sms88 2009-12-12
  • 打赏
  • 举报
回复
加上打印信息后就更能看不问题了

void GetNext(const char *Str,int *next)
{
int j=0, k=-1;
int len = strlen(Str);
next[0] = -1;
int temp = 0 ;
while(j < len)
{
if (k==-1 || Str[j] == Str[k])
{
j++;
k++;
printf( "j =%d,k = %d\r\n", j ,k ) ;
next[j] = k;
}
else
{
printf( "k = %d\r\n" , k ) ;
k = next[k];
}
}
int b = 0 ;
}
go_Michael 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mstlq 的回复:]
引用 7 楼 lirg8405 的回复:
引用 4 楼 mstlq 的回复:
请勿试图修改字符常量区的数据……
C/C++ codechar q[]="abcaa";

???那里修改了?我有点菜,没看出来...


抱歉,看得不够仔细……
楼主的原因是……
j==len的时候,即j=5的时候,
访问了next[5],数据越界了
[/Quote]
正解
j==4的时候k==0
即j==k==a
所以j++,j=5;
对next[5]赋值越界。
sms88 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sms88 的回复:]
k = next[k];
调试了下,这里会出现k = -1时
k = next[-1] 出错了
[/Quote]

我错了,没这情况
mstlq 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lirg8405 的回复:]
引用 4 楼 mstlq 的回复:
请勿试图修改字符常量区的数据……
C/C++ codechar q[]="abcaa";

???那里修改了?我有点菜,没看出来...
[/Quote]

抱歉,看得不够仔细……
楼主的原因是……
j==len的时候,即j=5的时候,
访问了next[5],数据越界了
sms88 2009-12-12
  • 打赏
  • 举报
回复
k = next[k];
调试了下,这里会出现k = -1时
k = next[-1] 出错了
lirg8405 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sduxiaoxiang 的回复:]
引用 2 楼 lirg8405 的回复:
我用VC6和BCB6 调试,q值都取不到了,输入出现读地址错误

08调试没问题
[/Quote]
我用VS2005调试下看看
lirg8405 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]
请勿试图修改字符常量区的数据……
C/C++ codechar q[]="abcaa";
[/Quote]
???那里修改了?我有点菜,没看出来...
sduxiaoxiang 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lirg8405 的回复:]
我用VC6和BCB6 调试,q值都取不到了,输入出现读地址错误
[/Quote]
08调试没问题
sms88 2009-12-12
  • 打赏
  • 举报
回复

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
void GetNext(const char *Str,int *next)
{
int j=0, k=-1;
int len = strlen(Str);
next[0] = -1;
while(j < len)
{
if (k==-1 || Str[j] == Str[k])
{
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
}

int main()
{
char *q = "abcaa";
int next[6] ={0};
GetNext(q,next);
printf( "%s", q) ;
getchar() ;
return 0 ;
}
mstlq 2009-12-12
  • 打赏
  • 举报
回复
请勿试图修改字符常量区的数据……
char q[] = "abcaa";
lirg8405 2009-12-12
  • 打赏
  • 举报
回复
输出
lirg8405 2009-12-12
  • 打赏
  • 举报
回复
我用VC6和BCB6 调试,q值都取不到了,输入出现读地址错误
sduxiaoxiang 2009-12-12
  • 打赏
  • 举报
回复
调试Q没变化

64,654

社区成员

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

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