Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does a C null terminator `\0` show up as `\000` during GDB debugging?

Tags:

c

character

gdb

During my GDB debugging sessions, I've noticed that null terminator characters, denoting the end of a string, and shown as \0 in C files, show up as \000 in GDB when displaying the value of a variable storing such a character.

(gdb) print buffer[10]
$2 = 0 '\000'

Can anyone tell me why that is?

like image 609
Chrisuu Avatar asked Oct 18 '25 03:10

Chrisuu


2 Answers

GDB seems to always use 3 octal digits to display character escapes - and for a good reason_ Consider the following string

const char *str = "\1\2\3\4\5";

then

(gdb) p str
$1 = 0x555555556004 "\001\002\003\004\005"

This is because C standard says that an escape sequence consists of maximum of 3 octal digits. Thus if you write:

"\0a"

it means string literal of two characters - null followed by a. But if you write

"\01"

it means a string literal of one character: ASCII code 1 - Start-of-Header control character. In fact the shortest way to write ASCII null followed by the digit 1 (i.e. ASCII code 49) in a string literal is "\0001" The other possibilities are "\0" "1" using string concatenation; separate escapes "\0\61"; or using hex escapes \x..., all of which will be even longer....

So by always using 3 octal digits, GDB can produce consistent output for strings - such that when copied to a C program will result in the same string during runtime. Furthermore the output routine is simpler because it does not need to consider the following character.


This record '\0' is an octal escape sequence of a character constant (literal).

An octal escape sequence may contain at most three octal digits.

like image 40
Vlad from Moscow Avatar answered Oct 20 '25 18:10

Vlad from Moscow



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!