孤不冷cing 发表于 2022-11-25 22:04:34

关于scanf的问题

$ cat test0.c
#include <stdio.h>

int main(void)
{
        char name;

        scanf("%s", name);
        printf("%s\n", name);

        return 0;
}
$ gcc test0.c -o test0 && ./test0
百合花
百合花


$ cat test1.c
#include <stdio.h>

int main(void)
{
        char *name;

        scanf("%s", name);
        printf("%s\n", name);

        return 0;
}
$ gcc test1.c -o test1 && ./test1
百合花
段错误 (核心已转储)


$ cat test2.c
#include <stdio.h>

int main(void)
{
        char *name;

        name = "百合花";
        printf("%s\n", name);

        return 0;
}
$ gcc test2.c -o test2 && ./test2
百合花



第一个scanf对字符数组赋值,成功
第二个scanf对字符指针赋值,失败
第三个直接对字符指针赋值,成功
如上三种情况,我现在很混乱。
不知道scanf怎么用,也不知道字符数组和字符指针怎么赋值,感觉之前学的东西混成一团浆糊了。
这三种情况为什么会这样啊???

jackz007 发表于 2022-11-25 22:04:35

本帖最后由 jackz007 于 2022-11-25 22:24 编辑

      char * name       ;         // name 只是一个指针,并未指向任何内存地址
      scanf("%s", name) ;         // 把键盘输入存入一个无效的内存地址,导致程序奔溃。
       一个指针在使用前必须要做 1 件事,一定要指向一个可以使用的存储空间。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
      char * name               ;
      name = (char *) malloc(256) ;// 使用前,一定要为 name 分配足够的存储空间
                                       // 这一句的意思是让 name 指向新分配的 256 字节的存储空间
      scanf("%s", name)         ;
      printf("%s\n", name)      ;
      free(name)                  ;// name 的存储空间使用完毕后,要及时释放
      return 0;
}

人造人 发表于 2022-11-25 22:11:37

你第2个代码的name指向哪里了?
第2个改成这样
sh-5.1$ cat main.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
      char *name;

      name = malloc(10);

      scanf("%s", name);
      printf("%s\n", name);

      free(name);

      return 0;
}
sh-5.1$ ./main
百合花
百合花
sh-5.1$

你干嘛哈哈哎哟 发表于 2022-11-25 22:12:53

第二个是因为指针变量没有初始化吧,如果你char a    然后      name=a; 其他都不变,就没有问题了

桃花飞舞 发表于 2022-11-26 17:19:23

本帖最后由 桃花飞舞 于 2022-11-26 17:27 编辑

第一个应该可以理解吧。第二个楼上都有解释,第三个是下面这样。

"百合花""abcde""hello world" 都是字符串,也是一个无名的字符数组

字符串是一个特殊的字符数组
字符指针又可以指向一个字符数组
因此字符指针可以指向一个字符串

孤不冷cing 发表于 2022-11-26 18:53:55

jackz007 发表于 2022-11-25 22:11
一个指针在使用前必须要做 1 件事,一定要指向一个可以使用的存储空间。

噢噢噢,十分清楚!
我把这些基础又十分重要的点给忘了
我一直把字符指针直接当成一个字符串变量,已经忘记它是指针了{:10_266:}
感谢

孤不冷cing 发表于 2022-11-26 18:54:48

人造人 发表于 2022-11-25 22:11
你第2个代码的name指向哪里了?
第2个改成这样

你们回答的好快啊{:10_257:}
页: [1]
查看完整版本: 关于scanf的问题