最近,我遇到了一个面试问题,以确定以下printf语句的输出:
printf("test %s\n",NULL);
printf("test %s\n",NULL);
printf("%s\n",NULL);
printf("%s\n",NULL);测试(空) 测试(空) 分段故障(堆芯倾弃)
我不知道为什么它有一个分割的错误,在过去的两个打印‘s,而不是前两个案例。
发布于 2015-10-31 19:23:46
行为是未定义的。
标准说
C11-7.21.6/9
..。如果任何参数不是对应的转换规范的正确类型,则行为是未定义的。
%s in printf需要一个参数,该参数应该是指向字符类型数组的初始元素的指针。
发布于 2015-10-31 19:23:25
发布于 2015-10-31 19:25:25
这是面试问题吗?唯一有效的答案是“它会把你的猫涂成绿色,或者做一些完全不同的事情,比如旅行到宇宙的尽头”。如果他们不接受这个答案,你就不想在那里工作。
更重要的是,您看到的输出可能是用GNU C library创建的。
传递0进行%s转换是未定义的行为,其最可能的结果是崩溃程序。glibc内置了一些安全措施,可以自动替换0指针的字符串(null)。您可能会争论这是否是一个好主意,但这是合法的,因为行为是未定义的 --实现可以做它想做的任何事情。包括像你以后经历的那样的坠机。
https://stackoverflow.com/questions/33455582
复制相似问题