Aja*_*aur 1 c string printf pointers
当我尝试运行以下代码时:
#include <stdio.h>
void main()
{
char *a[10] = {"hi", "hello", "how"};
int i = 0, j = 0;
a[0] = "hey";
for (i = 0;i < 10; i++)
printf("%s", a[i]);
}
Run Code Online (Sandbox Code Playgroud)
它给了我输出为:
heyhellohow(null)(null)(null)(null)(null)(null)(null)
Run Code Online (Sandbox Code Playgroud)
而当我在printf语句中插入'\n'时:
#include <stdio.h>
void main()
{
char *a[10] = {"hi", "hello", "how"};
int i = 0, j = 0;
a[0] = "hey";
for (i = 0;i < 10; i++)
printf("%s\n", a[i]);
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下输出:
hey
hello
how
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我试着在网上阅读材料,这一点,我发现这是因为格式说明,并自动转换的printf来放编译器和却将不承认"%S \n",但我仍然无法理解.任何人都可以用简单的术语来解释
为%s格式说明符传递空指针prinf()是未定义的行为.在这种情况下,运行时试图很好并且为这种情况显示"(null)".在另一种情况下,未定义的行为是崩溃.
造成这种差异的一个可能原因是编译器工具链有时会转换printf("%s\n", xxx)为等效的puts(xxx)(GCC肯定会在很多情况下这样做).我猜puts()你的空指针并不是很好.
就个人而言,我喜欢它时将"%s"空指针显示为"(null)" - 这使得在添加一些快速脏调试日志时更加方便.但是,如果你这样做,你不能在程序崩溃时抱怨,所以你不应该依赖它来做任何事情.
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |