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

时间:2015-10-21 20:23:42

标签: c string pointers printf

当我尝试运行以下代码时:

#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]);
}

它给了我输出:

heyhellohow(null)(null)(null)(null)(null)(null)(null)

当我在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]);
}

它给了我以下输出:

hey
hello
how  
Segmentation fault

我尝试阅读在线资料,我发现这是因为格式说明符并且编译器自动将 printf 转换为 puts 并且 puts 不承认“%s \ n”,但我仍然无法理解。任何人都可以用简单的方式解释这一点。

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

您正在声明一个包含10个char指针的数组。赋值a[0] = "hey",使指针a [0]指向字符串文字&#34;嘿&#34;它存储在只读存储器中,你丢失了字符串字面值&#34; hi&#34;。

分段错误是由于将空指针传递给循环中的函数printf(),超出了第三个元素。这称为未定义行为。