A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. #import <stdio.h>
  2. int main()
  3. {
  4.     char *p;
  5.     scanf("%s",p);
  6.     printf("%s",p)
  7.     return 0;
  8. )
复制代码


/* 前几天在论坛上看到有人提问这个问题,以上代码为什么会错误。我在自己的电脑上尝试了一下,结果发现我的电脑是可以运行的,输入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;
}

评分

参与人数 1技术分 +1 收起 理由
Micro + 1 很给力!

查看全部评分

4 个回复

正序浏览
本帖最后由 流风124 于 2015-3-25 21:38 编辑

按照楼主的做法,指针其实有点多余,我有一个关于这个问题的解决方法,大家一起来探讨探讨定义字符串指针的时候直接开辟存储空间例如:
char *input = (char *) malloc(M);//M是预定义的一个变量,值是100
scanf("%s",input);

这是我在基础测试里用到的,使用malloc()函数,必须在开头加上
#include <stdlib.h>




回复 使用道具 举报
那直接输入c不就行了,干嘛还要个指针- -
回复 使用道具 举报
粘糊浆 发表于 2015-3-19 11:26
你是学员还老师?

正在等待考试的学员
回复 使用道具 举报
你是学员还老师?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马