Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么输出长度为6?_C - Fatal编程技术网

C 为什么输出长度为6?

C 为什么输出长度为6?,c,C,我已经编写了一个简单的程序,用这种方法计算字符串的长度。 我知道还有其他方法。但我只是想知道为什么这个程序会给出这个输出 #include <stdio.h> int main() { char str[1]; printf( "%d", printf("%s", gets(str))); return 0; } 除非您总是从标准输入中传递空字符串,否则您将调用未定义的行为,因此输出几乎可以是任何内容,也可能会崩溃str不能是超过零个字符的格式良好的

我已经编写了一个简单的程序,用这种方法计算字符串的长度。 我知道还有其他方法。但我只是想知道为什么这个程序会给出这个输出

#include <stdio.h>
int main()
{
     char str[1];
     printf( "%d", printf("%s", gets(str)));

     return 0;
}

除非您总是从标准输入中传递空字符串,否则您将调用未定义的行为,因此输出几乎可以是任何内容,也可能会崩溃
str
不能是超过零个字符的格式良好的C字符串

char str[1]
为单个字符分配存储空间,但该字符必须是
num
字符才能满足C字符串约束。您需要创建一个足够大的字符数组,以容纳正在使用
get
编写的字符串


“(null)6”作为输出可能意味着
获取
返回
null
,因为它由于某种原因失败,或者堆栈损坏,导致返回值被零覆盖(根据未定义的行为解释)。6后面应该是“(null)”,因为
printf
的返回值是打印的字符数,“(null)”是六个字符长。

除非您总是从标准输入中传递空字符串,否则您调用的是未定义的行为,因此输出几乎可以是任何内容,也可能会崩溃
str
不能是超过零个字符的格式良好的C字符串

char str[1]
为单个字符分配存储空间,但该字符必须是
num
字符才能满足C字符串约束。您需要创建一个足够大的字符数组,以容纳正在使用
get
编写的字符串


“(null)6”作为输出可能意味着
获取
返回
null
,因为它由于某种原因失败,或者堆栈损坏,导致返回值被零覆盖(根据未定义的行为解释)。6后面应该是“(null)”,因为
printf的返回值是打印的字符数,“(null)”是六个字符长。

它调用未定义的行为。在这种情况下,你可以得到任何东西。如果未传递空字符串,则至少
str
应为
2
字节。

它调用未定义的行为。在这种情况下,你可以得到任何东西。如果未传递空字符串,则至少
str
应为
2
字节。

声明变量时,会保留一些空间来存储值。 保留空间可以是以前由其他人使用的空间 代码并具有值。当变量超出范围或
空闲时
d 该值不会被擦除(也可能是,任何东西都会被擦除)。只有程序可以访问 撤销对该变量的访问

当你从一个统一的位置阅读时,你可以得到任何东西

这是未定义的行为,而你正在这样做


声明变量时,gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3的输出为
0
。 保留空间可以是以前由其他人使用的空间 代码并具有值。当变量超出范围或
空闲时
d 该值不会被擦除(也可能是,任何东西都会被擦除)。只有程序可以访问 撤销对该变量的访问

当你从一个统一的位置阅读时,你可以得到任何东西

这是未定义的行为,而你正在这样做


gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3的输出是
0
您的程序有几个问题

首先,您定义的字符缓冲区太短,一个字符串的1字符缓冲区只能容纳一个字符串,即空字符串。这是因为您需要在字符串末尾使用null来终止它

接下来,您将使用
get
函数,这是非常不安全的(正如编译器几乎肯定警告过您的),因为它只是盲目地获取输入并将其复制到缓冲区中。由于缓冲区的长度为0+终止符字符,因此将自动将字符串结尾覆盖到内存的其他区域,这些区域可能也可能包含重要信息,例如
rsp
(返回指针)。这是粉碎堆栈的经典方法

第三,将
printf
函数的输出传递给另一个
printf
printf
不是为格式化字符串和返回字符串而设计的,还有其他函数可用于此。通常,您要使用的是
sprintf
,并以字符串形式传递它


请阅读关于这类事情的文档,如果你不确定任何具体的事情,请在尝试编程之前先阅读。您似乎对许多重要C函数的基本用法感到困惑。

您的程序有几个问题

首先,您定义的字符缓冲区太短,一个字符串的1字符缓冲区只能容纳一个字符串,即空字符串。这是因为您需要在字符串末尾使用null来终止它

接下来,您将使用
get
函数,这是非常不安全的(正如编译器几乎肯定警告过您的),因为它只是盲目地获取输入并将其复制到缓冲区中。由于缓冲区的长度为0+终止符字符,因此将自动将字符串结尾覆盖到内存的其他区域,这些区域可能也可能包含重要信息,例如
rsp
(返回指针)。这是粉碎堆栈的经典方法

第三,将
printf
函数的输出传递给另一个
printf
printf
不是为格式化字符串和返回字符串而设计的,还有其他函数可用于此。通常,您要使用的是
sprintf
,并以字符串形式传递它(null)6