int printf (const char* format, ... );
这是printf的签名。
我不明白的是,printf如何知道第一个参数的长度(const char* format
)。
它知道开始(因为它是一个指针,我得到了),但指针没有结束或什么。通常当你想要打印一些东西时你必须给出一个长度(例如,Linux的sys_write
),那么printf如何知道呢?
编辑:
我一直在查看我在ASM中编写的代码,我认为它只是查找\0
个字符。这是对的吗?
答案 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个字符。