黑马程序员技术交流社区
标题: c语言关于char *p; scanf("%s",p); 会出现不同结果的理解。 [打印本页]
作者: a380vs747` 时间: 2015-3-19 11:21
标题: c语言关于char *p; scanf("%s",p); 会出现不同结果的理解。
- #import <stdio.h>
- int main()
- {
- char *p;
- scanf("%s",p);
- printf("%s",p)
- return 0;
- )
复制代码
/* 前几天在论坛上看到有人提问这个问题,以上代码为什么会错误。我在自己的电脑上尝试了一下,结果发现我的电脑是可以运行的,输入abc,打印出abc。
后来我想了一下为什么有的电脑会不可以。这可能是跟内存有关的。
一开始定义char *p;时并没有给p分配地址,也没有对地址内容初始化,指针p可能指向系统内任意一个地址空间。(这里可以在定义(char *p)之后立马打印p,可以看到此时P指向的地址是有内容的,说明它已经指向了一个内存地址。)
如果该空间是可读可写,那么后面的scanf操作可以成功。如果p指向的内存地址是只读的,(比如系统某个程序的运行正在使用这个空间)那么就无法写入内容了。因此不同的电脑,不同的编程软件,内存的使用情况不同,结果也就不同了。
可以进行如下改进*/
int main()
{
char *p;
char c[20] = {'/0'};
// 这里定义一个字符数组,清空。再把p指向c,这样p指向的内存就完全没有问题了,可读可写。
p = c;
scanf("%s",p);
printf("%s",p);
return 0;
}
作者: 粘糊浆 时间: 2015-3-19 11:26
你是学员还老师?
作者: a380vs747` 时间: 2015-3-25 10:53
正在等待考试的学员
作者: adslunk 时间: 2015-3-25 11:43
那直接输入c不就行了,干嘛还要个指针- -
作者: 流风124 时间: 2015-3-25 21:32
本帖最后由 流风124 于 2015-3-25 21:38 编辑
按照楼主的做法,指针其实有点多余,我有一个关于这个问题的解决方法,大家一起来探讨探讨定义字符串指针的时候直接开辟存储空间例如:
char *input = (char *) malloc(M);//M是预定义的一个变量,值是100
scanf("%s",input);
这是我在基础测试里用到的,使用malloc()函数,必须在开头加上
#include <stdlib.h>
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |