黑马程序员技术交流社区

标题: 问一个有技术含量的问题,在群里问了很多大神,没有搞懂! [打印本页]

作者: gululu23    时间: 2014-10-17 20:32
标题: 问一个有技术含量的问题,在群里问了很多大神,没有搞懂!
问题:指针在scanf里面是否可以用?
以下代码为什么能运行??求解
#include<stdio.h>
int   main()
{
    char *p;
    printf("请输入一个名字");
    scanf("%s",p);
    printf("%s",p);

    return 0;
}
作者: IOS小菜鸟    时间: 2014-10-17 21:44
额,我试了下,p好像是存放了字符串的地址,然后我用long int a ,
scanf("%s" , a),程序也能输出字符串,换成int就不行了。不知道是不是long int和char * 都是8个字节,刚好能储存字符串地址的原因。
作者: 明天过后1    时间: 2014-10-17 22:44
这样写不可取哦
1.首先 scanf("%s",p); 是吧你键盘的字符串放到指定的地址,而指针p指向的地址还没分配好内存空间,那么你写完了之后它只能往 系统给p分配的地址往后写入相应的字符串,这时可能运行不会报错,原因可能是main函数的栈空间充足,能够容纳你写入的字符串.
2.内存寻址是由高到底的,你试一下,在 char *p; 前定义一个 long a = 0;然后在运行程序,这时可能会内存越界了,破坏了变量a的内存空间

作者: 崔石炫    时间: 2014-10-17 22:56
明天过后1 发表于 2014-10-17 22:44
这样写不可取哦
1.首先 scanf("%s",p); 是吧你键盘的字符串放到指定的地址,而指针p指向的地址还没分配好内 ...

有道理。

但是,不管出于什么原因,我是不愿意写这样的代码的。始终要记得规范。
作者: 弹琴骚年    时间: 2014-10-17 23:16
我也试了试:
char *a; // 指针变量a里未初始化就有值了,a值为0x7fff5fbff858,*a == '\0'
char *b; // b = NULL 不初始化,则没有值
char *c; // c = NULL 不初始化,则没有值
printf("please input a name : ");
scanf("%s", p);
printf("%s\n", p);
printf("%p", p);

不管试了几次a里面的地址都是一样的,即使换了别的类型也不例外。
所以我觉得这应该是编译器的问题,编译的时候默认给第一个定义的指针变量一个地址,让指针指向一个数值为""的存储空间。但是之后的未初始化的指针变量就不能够使用了。
这也许就是编译器的弱语法允许我们犯一次指针变量未初始化就使用的错误,仅有一次机会。第二次就不允许了。。:lol
作者: gululu23    时间: 2014-10-18 19:54
这个问题是我在写另一个程序的会后发现的! 当然以后这种肯定是不会这样写的咯!!
作者: 哈利梅    时间: 2014-10-18 22:55
好问题,我觉得应该可以的吧,首先语法没有啥问题,另外,OC或者C都是弱语法,老师不是说,任何一个变量都是有值的吗,没有赋值的情况下就等于0,所以p的值一开始定义的时候其实就是0,而且又是char类型的,也就是说,你输入的数值只要是在char规定的-128~127范围内的都应该不会报错,如果超过这个范围就应该出问题了,因为超过了char的空间了,所以你给p赋一个合适的值,然后输出,等于是把p = 0换成了你赋的值而已,可以的吧~~~
作者: 哈利梅    时间: 2014-10-18 22:56
上面写错了,最后应该是p == 0




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