gpt4 book ai didi

c - printf ("%s\n",str);给出段错误但 printf ("%s",str);不要,其中 "str"是一个字符串指针

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:22 28 4
gpt4 key购买 nike

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

#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 转换为 putsputs 不认识 "%s\n",但我仍然无法理解。谁能用简单的术语解释一下。

最佳答案

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

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

就我个人而言,我喜欢 "%s" 将空指针显示为 "(null)"- 它在添加一些快速调试日志记录时更加方便。但是,如果您这样做,您就无法在程序崩溃时提示,因此您不应该依赖它来做任何其他事情。

关于c - printf ("%s\n",str);给出段错误但 printf ("%s",str);不要,其中 "str"是一个字符串指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com