黑马程序员技术交流社区

标题: char *字符串问题 [打印本页]

作者: 触底反弹    时间: 2015-11-11 14:56
标题: char *字符串问题
本帖最后由 触底反弹 于 2015-11-13 22:03 编辑

想问一下这个问题是怎么回事

屏幕快照 2015-11-11 下午2.53.52.png (113.69 KB, 下载次数: 125)

屏幕快照 2015-11-11 下午2.53.52.png

作者: 触底反弹    时间: 2015-11-11 14:57
能有朋友直接说一下修改意见吗?
作者: wwf707542865    时间: 2015-11-11 18:45
你必须给字符串一个长度,要么定义的时候就直接赋值,如果想从键盘接收输入,只能用给定长度的字符数组
作者: 触底反弹    时间: 2015-11-11 20:56
wwf707542865 发表于 2015-11-11 18:45
你必须给字符串一个长度,要么定义的时候就直接赋值,如果想从键盘接收输入,只能用给定长度的字符数组 ...

恩,这个我试过,这个是做基础测试题的时候遇到的,百度了一下好多人都是这样的,但是都没问题,为什么我写就有问题
作者: 奔波霸儿    时间: 2015-11-11 21:38
直接苹果本了啊
作者: Morning_jcg    时间: 2015-11-11 22:13
str只是指向一个char型变量的指针,怎么看都不可以,,你注释掉的那句不是对的么,,
作者: 触底反弹    时间: 2015-11-11 22:16
奔波霸儿 发表于 2015-11-11 21:38
直接苹果本了啊

学习嘛  装备还是要买的
作者: 触底反弹    时间: 2015-11-11 22:18
Morning_jcg 发表于 2015-11-11 22:13
str只是指向一个char型变量的指针,怎么看都不可以,,你注释掉的那句不是对的么,, ...

恩  注释掉的是我没办法解决问题才这样的   我只是看到很多人都是写的char *str这样的    可是自己写怎么就不行  又没报错信息  实在找不到原因,所以提出来问问
作者: 触底反弹    时间: 2015-11-11 22:20
Morning_jcg 发表于 2015-11-11 22:13
str只是指向一个char型变量的指针,怎么看都不可以,,你注释掉的那句不是对的么,, ...

还有看你技术分这么多,怎么来的,能说说吗
作者: Morning_jcg    时间: 2015-11-11 22:28
触底反弹 发表于 2015-11-11 22:20
还有看你技术分这么多,怎么来的,能说说吗

技术分是黑马币换的,,首先,就算你说别人说能我还是觉得不能,至少这么用是不能的。真说要这么用,也要char a[100]; char *str=a;  这样才行。
作者: 神陪我流浪    时间: 2015-11-11 22:49
给字符串一个长度,要么定义的时候就直接赋值
作者: 正在输入中...    时间: 2015-11-11 23:09
这个问题书本上叫野指针错误,就是一个指针,你没有给他分配内存空间,或者分配了内存空间,释放了没有置空,又再次去访问指针所造成的错误就是野指针错误,野指针错误属于段错误的一种,一种内存的非法访问。如果还有其他问题,想要进行交流的话,可以直接去我那里进行留言。
作者: 韩三少    时间: 2015-11-12 00:27
问题很大这个
作者: 熊德玺    时间: 2015-11-12 00:42
如果定义一个char *str字符串指针的话, 那么这个char *str;在内存中表示的就是一个常量了,而你第75行,用str表示地址是没有错,但是用的是%s来表示输入值,这是不对的,因为%s表示的是输入一个字符串,所以你这样改为%c,就可以了,然后你让输入的时候,输入单个字符,就可以编译通过了  
作者: 熊德玺    时间: 2015-11-12 00:46
当然,你也可以,更改一下上面的指针, 改为 char (*str)[];   因为,字符串指针,首先必须是个字符串,而字符串是数组的一种,字符串可以看成是一个二维数组,这样你下面的scanf的用法就对了,  希望对你有用
作者: 醉叶惜秋    时间: 2015-11-12 01:01
scanf里面不是应该取地址么
作者: 触底反弹    时间: 2015-11-12 09:48
醉叶惜秋 发表于 2015-11-12 01:01
scanf里面不是应该取地址么

字符串指针不已经是地址了吗
作者: 触底反弹    时间: 2015-11-12 09:51
正在输入中... 发表于 2015-11-11 23:09
这个问题书本上叫野指针错误,就是一个指针,你没有给他分配内存空间,或者分配了内存空间,释放了没有置空 ...

其实我也大概知道错误,只不过看见别人给的代码都可以,就不确定原因了,因为不止一个人,还是谢谢啦
作者: 触底反弹    时间: 2015-11-12 09:55
熊德玺 发表于 2015-11-12 00:46
当然,你也可以,更改一下上面的指针, 改为 char (*str)[];   因为,字符串指针,首先必须是个字符串,而字符串 ...

nice啊,用数组指针确实就能想得通了,我先试一下,谢谢了
作者: 触底反弹    时间: 2015-11-12 10:17
大概说一下自己理解吧!scanf 本就是对某一内存空间赋值,而char *str只是一个指针,声明后并未赋值,也就是野指针,所以scanf赋值时会报错
作者: cube川    时间: 2015-11-12 11:02
你把char *str改成char *str=NULL,试试对不对

作者: 触底反弹    时间: 2015-11-12 11:05
cube川 发表于 2015-11-12 11:02
你把char *str改成char *str=NULL,试试对不对

之前我试过,不行的
作者: black747521    时间: 2015-11-12 13:11
你是想定义一个字符串指针,但是字符串指针指向的字符串是保存在常量区的,你可以初始化的时候定义,
char *str = “hello”; 或者也可以给他重新指向 str =  “world”;但是不能使用scanf函数给他赋值。因为常量区是只读的。你只能定义一个字符串数组 char *str[]; 这个是可以使用scanf函数输入的。
作者: 触底反弹    时间: 2015-11-12 13:14
black747521 发表于 2015-11-12 13:11
你是想定义一个字符串指针,但是字符串指针指向的字符串是保存在常量区的,你可以初始化的时候定义,
char  ...

恩恩  理解了,就是定义一个指针数组指向一个匿名指针吧,不过试过还是报错了,编译通过了但输入值后运行报错了
作者: black747521    时间: 2015-11-12 13:17
触底反弹 发表于 2015-11-12 13:14
恩恩  理解了,就是定义一个指针数组指向一个匿名指针吧,不过试过还是报错了,编译通过了但输入值后运行报 ...

定义指针数组是什么鬼,怎么会用到指针数组。
作者: 触底反弹    时间: 2015-11-12 13:20
black747521 发表于 2015-11-12 13:17
定义指针数组是什么鬼,怎么会用到指针数组。

我是这么理解的,char *str[]不是一个指针数组吗?抱歉,c也才刚开始复习,搞不清楚了
作者: cube川    时间: 2015-11-12 17:52
错误的原因是:str是一个野指针,他并没有指向某一块内存空间,所以不允许这样写。如果想这样写的话改成这样
char *str=(char *)malloc(100);这样就行了,手动分配一块内存空间,然后再输入
作者: zhecipinle    时间: 2015-11-12 18:04
必须是数组才能这样,字符指针是常量,不能修改。
作者: poxiao    时间: 2015-11-12 20:09
char *str如果你不在定义的时候给他赋常量字符串那么这个指针就是有分配内存的,所以你用scanf进行输入的时候其实是存储不了的,你要是真想用这种语法,可以这么写:
char *str;
str = malloc (sizeof (char) * 10);
gets(str);
作者: 触底反弹    时间: 2015-11-12 22:31
poxiao 发表于 2015-11-12 20:09
char *str如果你不在定义的时候给他赋常量字符串那么这个指针就是有分配内存的,所以你用scanf进行输入的时 ...

其实这就等同于赋值一个数组了
作者: 江流石不动    时间: 2015-11-12 23:18
又学到了一个新知识
作者: 触底反弹    时间: 2015-11-13 00:12
江流石不动 发表于 2015-11-12 23:18
又学到了一个新知识

共勉     




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2