的printf( "%S \n" 个,STR); 给出分段错误但printf("%s",str); 不要,"str"是一个字符串指针

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",但我仍然无法理解.任何人都可以用简单的术语来解释

Mic*_*urr 7

%s格式说明符传递空指针prinf()是未定义的行为.在这种情况下,运行时试图很好并且为这种情况显示"(null)".在另一种情况下,未定义的行为是崩溃.

造成这种差异的一个可能原因是编译器工具链有时会转换printf("%s\n", xxx)为等效的puts(xxx)(GCC肯定会在很多情况下这样做).我猜puts()你的空指针并不是很好.

就个人而言,我喜欢它时将"%s"空指针显示为"(null)" - 这使得在添加一些快速脏调试日志时更加方便.但是,如果你这样做,你不能在程序崩溃时抱怨,所以你不应该依赖它来做任何事情.