Closed6
printf
prinf上での16進数のprefixは0x
ではなく、xのみ
なぜならエスケープシーケンスが認知するのは最初の文字だけなので、
\0x
としてしまうと、最初の0が認知されてNULL文字と同等のものとみなされるから。
なのでエスケープ + xで以下に16進数が来るということを示している。
以下のようなコードが有るときにコンパイラはwarningを出し、出力結果は何もない。
(ファイルに出力するとファイルサイズが0のファイルが生成される)
#include <stdio.h>
int main()
{
printf("\0");
return (0);
}
これはなぜかというとprintfが第一引数を文字として扱っているからである。
文字として扱う場合、文字列の終端はNULL文字であるので、文字列の中に\0
を入れても、出力結果としては何も変わらない。
ちなみにprintf("") と prinf("\0")
の時の実行結果の差分をアセンブリファイルで見ると
(main.sが("")のとき、main_1.s("\0")のとき)
❯ diff main.s main_1.s
11c11
< leaq L_.str(%rip), %rdi
---
> leaq l_.str(%rip), %rdi
21,23c21,23
< .section __TEXT,__cstring,cstring_literals
< L_.str: ## @.str
< .space 1
---
> .section __TEXT,__const
> l_.str: ## @.str
> .space 2
.strの中の.spaceが変わっている。
これは与えられた文字列に対して確保するメモリがいくつなのかを示している
このスクラップは2021/10/15にクローズされました