gpt4 book ai didi

c - 向 printf() 添加换行符会更改代码行为

转载 作者:IT王子 更新时间:2023-10-29 00:15:35 26 4
gpt4 key购买 nike

出于某种原因,添加 \nprintf()更改以下代码的行为。没有\n的代码版画 (null)而带有 \n 的代码导致 Segmentation fault .

Printf.c

#include <stdio.h>

int main(int argc, char* argv[]){
printf("%s", argv[1]);
}

Printf.c - 输出

$ gcc -o Printf Printf.c
$ ./Printf
(null)

Printf_Newline.c

#include <stdio.h>

int main(int argc, char* argv[]){
printf("%s\n", argv[1]);
}

Printf_Newline.c - 输出

$ gcc -o Printf_Newline Printf_Newline.c
$ ./Printf_Newline
Segmentation fault (core dumped)

我很想知道这背后的原因。

最佳答案

两者都是未定义的行为,所以答案可以到此为止。

但是对于 (null) 的输出至少有一个解释。这是 glibc(GNU C 库)中的一个扩展。在 printf() 中为 %s 传递 0 在 C 标准中被视为未定义,因此很可能会产生在崩溃中。 glibc 的开发人员决定改为做一些有意义的事情。

第二次崩溃的原因是使用换行符,编译器决定优化:而不是 printf("%s\n", argv[1]),它执行 puts(argv[1]),根据 C 标准,它在语义上是等效的,因此是允许的优化。但是 glibc 的“(null)-trick”仅在 printf() 中实现。

您的程序中还有另一个未定义的行为:您可能访问argv 越界。无法保证当 i > argc 时,您会在 argv[i] 中找到什么值。 argc 有可能为 0,因此您也可以体验任何其他

关于c - 向 printf() 添加换行符会更改代码行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738298/

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