printf如何知道格式参数的长度?

时间:2013-03-17 23:46:31

标签: c++ c assembly printf

int printf (const char* format, ... );

这是printf的签名。 我不明白的是,printf如何知道第一个参数的长度(const char* format)。

它知道开始(因为它是一个指针,我得到了),但指针没有结束或什么。通常当你想要打印一些东西时你必须给出一个长度(例如,Linux的sys_write),那么printf如何知道呢?

编辑:

我一直在查看我在ASM中编写的代码,我认为它只是查找\0个字符。这是对的吗?

3 个答案:

答案 0 :(得分:10)

它是一个以null结尾的字符串(与C中的所有字符串一样),因此第一个ASCII NUL('\0'或plain 0)字节表示字符串的结尾。

如果在C中有一个字符串"meow",它实际上使用了5个字节的内存,在内存中看起来像这样。 \0显然是一个值为0的单字节。

meow\0

如果您想知道如何表示实际的'0'数字:数字0..9的ASCII值为48..57,因此"me0w"将有48个字节它的第三个位置。

答案 1 :(得分:1)

当正确声明字符串时,它的末尾总是有一个NULL(\ 0)值,该标记用于标记所有这些打印函数的字符串结尾。如果省略(在大多数情况下很难做到),打印功能只会保留打印内存,直到它在内存中运行为0值。

"任何"是一个以i n g \ 0

结尾的char数组

编辑: ' \ 0' == 0和' 0' != 0

答案 2 :(得分:0)

它不知道。试试printf("Hello \0 World\n");printf不知道该字符串包含15个字符。