鱼C论坛

 找回密码
 立即注册
查看: 2259|回复: 19

[已解决]关于字符串输入的问题

[复制链接]
发表于 2022-5-27 19:59:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int main()
{
        char *name;
        scanf("%s",name);
        printf("%s",name);
}

为什么这个代码不报错也不警告呢?

name 是一个野指针,我往野指针里写东西,居然不报错也不警告。
最佳答案
2022-5-27 20:47:02
一楼给出的代码肯定是存在问题的, name 未被初始化其指向的地址是不确定的,可以认为是野指针,向其指向的地址写入是(很)可能导致问题的。
但是要注意八楼的代码和一楼的不同,八楼的代码没有向未知地址写入数据,其进行的操作是将常量字符串 "aaaaa" 的(首)地址存储到指针变量 s 中,可以看作是对 s 的初始化。当然,用 const 修饰的指针变量存储字符串常量的地址可能更加恰当,但是比起一楼的代码问题已经小很多了。
至于警告问题要看你的编译器版本和设置,我使用的是 GCC 12.1.0 ,编译期望出现问题的代码从来都是至少加上 -Wall -Wextra 选项,两份代码都触发了警告:一楼的被警告 [warning: ‘name’ is used uninitialized] ,八楼的为 [warning: variable ‘s’ set but not used] 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-27 20:02:00 | 显示全部楼层
为什么说是野指针呢?我看它只是没有初始化而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:04:27 | 显示全部楼层
我尝试着运行了一下,楼主你写的代码符合代码语法,但不符合需求,编译器只校验语法和语义,所以就不会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:07:00 | 显示全部楼层
https://starsone.site/----/
https://advocatesnairobi.com/-/
https://sanakanwalfashion.com/----/
https://kerbymethodconsulting.com/-----79137/
https://diamonds.tokyo/-/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-27 20:07:32 | 显示全部楼层
当初约定 发表于 2022-5-27 20:02
为什么说是野指针呢?我看它只是没有初始化而已

野指针和未初始化的指针不是一个概念是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:09:03 | 显示全部楼层
宽泛的说它们是一样,准确的说是野指针包含未初始化的指针吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-27 20:13:00 | 显示全部楼层
当初约定 发表于 2022-5-27 20:09
宽泛的说它们是一样,准确的说是野指针包含未初始化的指针吧

那我就不知道怎么办了,要是在笔试遇到,我就不知道算错算对了。
我在c primer plus上看到的 ,
书上写可能会通过编译(但很可能会给出警告)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:16:29 | 显示全部楼层
如果是问是否符合要求,那肯定是不符合;但如果是问是否符合语法,那我认为肯定符合,这是我的看法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-27 20:21:19 | 显示全部楼层
当初约定 发表于 2022-5-27 20:16
如果是问是否符合要求,那肯定是不符合;但如果是问是否符合语法,那我认为肯定符合,这是我的看法

我在写C程序设计试题汇编 (第三版的)就谭浩强那一版的时候;
里面有选项是这样的
char *s;
s=“aaaaa”;
就是这样的表达形式;
给的选项说是对的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:22:39 | 显示全部楼层
等其他大哥来看看@Twilight6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-27 20:23:54 | 显示全部楼层
当初约定 发表于 2022-5-27 20:22
等其他大哥来看看@Twilight6

哈哈哈,可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:36:11 | 显示全部楼层
tyf1218405122 发表于 2022-5-27 20:21
我在写C程序设计试题汇编 (第三版的)就谭浩强那一版的时候;
里面有选项是这样的
char *s;

这里的s指向的是常量区的aaaaa,这里的s就不是也指针,所以是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:38:35 | 显示全部楼层
你这里的name所指向的地址是随机的,你给一块随机的地址赋值,还打印出来,这就好比你未经允许去别人家吃饭,还在在里面参观一样,违法的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:39:10 | 显示全部楼层
当初约定 发表于 2022-5-27 20:02
为什么说是野指针呢?我看它只是没有初始化而已

未初始化就是野指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-27 20:47:02 | 显示全部楼层    本楼为最佳答案   
一楼给出的代码肯定是存在问题的, name 未被初始化其指向的地址是不确定的,可以认为是野指针,向其指向的地址写入是(很)可能导致问题的。
但是要注意八楼的代码和一楼的不同,八楼的代码没有向未知地址写入数据,其进行的操作是将常量字符串 "aaaaa" 的(首)地址存储到指针变量 s 中,可以看作是对 s 的初始化。当然,用 const 修饰的指针变量存储字符串常量的地址可能更加恰当,但是比起一楼的代码问题已经小很多了。
至于警告问题要看你的编译器版本和设置,我使用的是 GCC 12.1.0 ,编译期望出现问题的代码从来都是至少加上 -Wall -Wextra 选项,两份代码都触发了警告:一楼的被警告 [warning: ‘name’ is used uninitialized] ,八楼的为 [warning: variable ‘s’ set but not used] 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-28 02:06:49 | 显示全部楼层
66666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-28 07:32:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-28 08:04:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-29 12:06:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-29 13:25:37 | 显示全部楼层

回帖奖励 +10 鱼币

来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 14:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表