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

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

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

编辑:

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

4

3 回答 3

11

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

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

meow\0

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

于 2013-03-17T23:48:14.147 回答
1

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

"Anything" 是一个以 ing \0 结尾的字符数组

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

于 2013-03-18T00:00:03.127 回答
0

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

于 2013-03-18T12:54:29.753 回答