|
60鱼币
- $ cat test0.c
- #include <stdio.h>
- int main(void)
- {
- char name[10];
- 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: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;
- }
复制代码
|
最佳答案
查看完整内容
一个指针在使用前必须要做 1 件事,一定要指向一个可以使用的存储空间。
|