数据结构——串的程序的小问题。

lbq199204 2012-11-07 10:06:03

# include <stdio.h>
# define MAXLEN 20

typedef struct {
char ch[MAXLEN+1];
int length;
}SString;

void print(SString * r);
void creat_str(SString * s);
SString * Compare(SString *a, SString *b);
int main(){

SString str_a, str_b, *result;
creat_str(&str_a);
creat_str(&str_b);
result = Compare(&str_a, &str_b);
[color=#99CC00]printf("第一次出现不相同的字符为:%c,其序号为:%d\n",result->ch[0], result->length);
print(result);[/color] return 0;
}

void print(SString * r){
printf("第一次出现不相同的字符为:%c, 其序号为:%d\n",r->ch[0], r->length);
}
void creat_str(SString * s){
int i,x;
printf("input in A:\n");
scanf("%d",&x);
for (i=0;i<MAXLEN || x!=0; i++){
s->ch[i] = x;
scanf("%d",&x);
}
s->lengrh = i+1;
return 0;
}

SString * Compare(SString *a, SString *b){
int i, j;
SString * temp = NULL;
for (i=0; i<a->length; i++){
for (j=0; j<b->length; j++){
if (a->ch[i] == b->ch[j])
break;
}
if (j>=b->length){
//printf("第一次出现不相同的字符为:%c, 其序号为:%d\n",a->ch[i], i+1);
temp->ch[0] = a->ch[i];
temp->length = i+1;
return temp;
}
}
}
}


result = Compare(&str_a, &str_b);这句能执行成功。

[color=#99CC00]printf("第一次出现不相同的字符为:%c,其序号为:%d\n",result->ch[0], result->length);
但是这句不能执行成功;
print(result);这句也不能。

问题:为什么会这样子呢,难道是指针返回的时候出错了?
之所以出错是不是因为temp是局部变量,Compare()函数结束后被释放掉了,造成内存越界!是这个样子的吧!

在linux下写.c文件,开始很不习惯呢,鼠标的滚轮都不能用了,编译是出现错误,也先对在vc++6.0中比较难找出问题了。
这次是练习写‘串’的简单的数据结构程序。大家再帮我看下,是否写的是否合乎‘串’的要求!
...全文
209 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
14号选手 2012-11-09
  • 打赏
  • 举报
回复
引用 13 楼 lbq199204 的回复:
引用 12 楼 xuchao1229 的回复:引用 11 楼 lbq199204 的回复:引用 10 楼 xuchao1229 的回复:引用 9 楼 lbq199204 的回复:引用 8 楼 xuchao1229 的回复:引用 7 楼 lbq199204 的回复:引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiM……
才看到,上面掉了一个赋值号,不好意思,呵呵 应该是temp=&a;
lbq199204 2012-11-09
  • 打赏
  • 举报
回复
引用 12 楼 xuchao1229 的回复:
引用 11 楼 lbq199204 的回复:引用 10 楼 xuchao1229 的回复:引用 9 楼 lbq199204 的回复:引用 8 楼 xuchao1229 的回复:引用 7 楼 lbq199204 的回复:引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指……
谢谢你了。结贴给分了。
lbq199204 2012-11-08
  • 打赏
  • 举报
回复
引用 6 楼 xuchao1229 的回复:
引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->length = i+1; 肯定出错啊. 那该怎么改呢?你要修改结构指针a,就用a来引用,或者temp=a;是temp的指针……
我不是要修改结构指针a,而是想用temp来保存第一次出现在a串,但不在b串出现的字符和那个序号。 不过谢谢你,我明白我哪里错了,我把指针当成可以存储数据,而不是存储指针的变量,是不?! 可以一楼那样子说的加个malloc。那样Compare()结束后temp就不悔被释放掉,我这样理解对吧?!
14号选手 2012-11-08
  • 打赏
  • 举报
回复
引用 11 楼 lbq199204 的回复:
引用 10 楼 xuchao1229 的回复:引用 9 楼 lbq199204 的回复:引用 8 楼 xuchao1229 的回复:引用 7 楼 lbq199204 的回复:引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有……
恩,结构体赋指针最好加上&符号 也就是temp&a 如果不想改变原有结构内容,给它设置一个只读就行了 调用的时候加一个const的关键字就行了
lbq199204 2012-11-08
  • 打赏
  • 举报
回复
引用 10 楼 xuchao1229 的回复:
引用 9 楼 lbq199204 的回复:引用 8 楼 xuchao1229 的回复:引用 7 楼 lbq199204 的回复:引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操……
哦,原来这样子,因为我最初的想法temp只是存储,一个字符和一个序号,如果,按到你以前的方式temp = a 这样子的话,会把a的某个值改变点的,而我又不想修改a的内容,所以现在觉得,我起初是掉在这个坑里了,最初,我应该把*result 改为 result,然后,temp = &result,这样就能用我最初想法解决这道题了。是不是?真的是谢谢你的帮助,让我受益匪浅。
14号选手 2012-11-08
  • 打赏
  • 举报
回复
引用 9 楼 lbq199204 的回复:
引用 8 楼 xuchao1229 的回复:引用 7 楼 lbq199204 的回复:引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->……
temp->tength = i+1; 这个语句本身没有问题,->就是指针引用结构体元素的符号,引用的就是内容而不是地址,你的问题是这个temp指针你没有获得这个结构体的首地址,没有首地址何谈偏移量什么的,这些都没有的,temp指针当然就没有意义,指向的地址只有编译器自己知道了,当然就变成了野指针,你这个地方就是越过了给予地址,直接给指针赋值了
lbq199204 2012-11-08
  • 打赏
  • 举报
回复
引用 8 楼 xuchao1229 的回复:
引用 7 楼 lbq199204 的回复:引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->length = ……
哦哦,我还是想错了点东西,那就是temp->tength = i+1;这句,因为它储存的内容是地址而不是数据,所以就算加了malloc也不行!所以当初定义这个temp就有点错误了。我这样理解对吗?
14号选手 2012-11-08
  • 打赏
  • 举报
回复
引用 7 楼 lbq199204 的回复:
引用 6 楼 xuchao1229 的回复:引用 4 楼 lbq199204 的回复: 引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->length = i+1; 肯定出错啊. 那该怎么改呢……
可以这么理解,但是你理解的还是有点问题,malloc函数只是给指针分配空间,避免产生野指针的危险,指针变量是改变其中存储的指向变量的地址值,而不是改变指向的内容的
14号选手 2012-11-07
  • 打赏
  • 举报
回复
引用 4 楼 lbq199204 的回复:
引用 2 楼 JiMoKuangXiangQu 的回复:temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->length = i+1; 肯定出错啊. 那该怎么改呢?
你要修改结构指针a,就用a来引用,或者temp=a;是temp的指针指向结构a或者b
lbq199204 2012-11-07
  • 打赏
  • 举报
回复
引用 3 楼 xuchao1229 的回复:
temp结构指针只是定义了这个指针变量,它又本身的地址,但是它本身的内容却没有,也就是所指向的地址值是没有,你后面就直接来个赋值temp->ch[0] = a->ch[i]; temp->length = i+1; 这当然是错误的啊,没有给予地址的指针直接赋值是很危险的,很容易造成程序崩溃的,这就是所谓的“野指针”
那该怎么改呢?
lbq199204 2012-11-07
  • 打赏
  • 举报
回复
引用 2 楼 JiMoKuangXiangQu 的回复:
temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->length = i+1; 肯定出错啊.
那该怎么改呢?
14号选手 2012-11-07
  • 打赏
  • 举报
回复
temp结构指针只是定义了这个指针变量,它又本身的地址,但是它本身的内容却没有,也就是所指向的地址值是没有,你后面就直接来个赋值temp->ch[0] = a->ch[i]; temp->length = i+1; 这当然是错误的啊,没有给予地址的指针直接赋值是很危险的,很容易造成程序崩溃的,这就是所谓的“野指针”
JiMoKuangXiangQu 2012-11-07
  • 打赏
  • 举报
回复
temp指针在函数里面根本初始化为NULL,一直都没有赋有意义的值,用空指针 temp执行下面的操作 temp->ch[0] = a->ch[i]; temp->length = i+1; 肯定出错啊.
guochanoo7 2012-11-07
  • 打赏
  • 举报
回复
你这不叫越界,temp根本就没有分配空间,你怎么写,加个malloc就没事了

69,371

社区成员

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

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