使用%s说明符时向scanf和printf传入int数组是否合法?
代码合法性判定
这段代码不合法,属于明确的C标准未定义行为。
原因如下:
scanf和printf都是可变参数函数,C标准规定可变参数列表中的参数只会执行默认参数提升(小整数类型提升为int、float提升为double),不会做指针类型的隐式转换。你传入的int数组会隐式转换为int*类型传入可变参数,而%s格式符明确要求参数为char*类型,二者类型不匹配,直接违反标准要求。- C标准中
fprintf和fscanf的相关规定也明确说明,不带l修饰符的%s对应的参数必须是指向字符数组首元素的指针,int数组完全不符合这个要求。
无溢出前提下能否正常回显?
不能得到标准层面的可靠保证。
在大多数主流桌面/服务器平台上,由于int类型的内存对齐要求高于等于char、内存按字节编址,字符输入的内容会按字节依次写入arr占用的内存空间,printf读取时按char*逐字节遍历的行为刚好符合预期,大概率能正常回显。但这只是平台的实现细节带来的巧合,不是标准规定的必然结果,换用对齐规则特殊的嵌入式平台、或者编译器开启高优化等级时,完全可能出现异常。
这种写法有没有实际价值?
没有任何符合标准的合理使用场景。
这种写法完全依赖特定平台的实现细节,可移植性为0,可读性极差,哪怕是追求极限性能的底层开发场景也不会采用这种不符合标准的写法,完全属于错误的代码示范。
内容的提问来源于stack exchange,提问作者klutt
相关产品推荐
相关产品推荐

