c - what will be the output of printf("%d","Hello"+1);? -
i running c program includes statement :
#include <stdio.h> #include <string.h> main() { printf("%d","hello"+1); } it gives 4196445 output.is correct..please explain logic
although "it undefined behavior according standard", here happens de-facto. please note it's general description, may different depending on platform (compiler, cpu architecture, operating system, mmu, standard-output controller, etc):
the compiler generates null-terminated string of characters (
"hello"), , places in code-section (ro-data section more accurate) of program.every time process created , executable image loaded memory (i.e., whenever run program), string containing characters
'h','e','l','l','o','\0'resides @ logical memory address 4196444. physical memory address of string can calculated adding value value of base-address register (although should of no concern you, program oblivious that).since the logical address of string remain 4196444 throughout every execution of program, compiler can replace calculation of
"hello"+1constant value 4196445.so can imagine instead of compiling
printf("%d","hello"+1), compiler has compiledprintf("%d",4196445). in fact, since"%d"string constant string located in code-section of program, replaced constant value.btw, if using variable pointing
"hello"string, compiler, unable determine value during compilation, generate code compute during runtime instead. computation performed using either stack or general-purpose registers (or possibly combination of both). here typical example of how value calculated through stack (which section of program - similar code-section, write-permission):the value of variable pushed stack.
the value 1 pushed stack.
the first 2 elements popped stack , added.
the result pushed stack.
in case, when
printf("%d","hello"+1)invoked:the address of string
"%d"pushed stack.the address of string
"hello"plus 1 pushed stack.the program counter (or call - instruction pointer) jumps address of function
printfin memory, , execution continues there.for every
%character in string pointed first argument passed functionprintf, function loads corresponding argument stack, , - based on type specified after%character - computes data printed.finally, outcome sent screen (to more accurate, every character in outcome, standard-output interrupt generated, causing pc (program counter) / ip (instruction pointer) jump iv (interrupt vector), designated isr (interrupt service routine), function other function in code, invoked, , in turn writes input character fifo queue of standard-output controller).
as implied @hvd in 1 of comments below:
on 64-bit system, %d% truncate result of "hello"+1 64-bit value 32-bit value. using %lld fix that, of course - correct solution use %p.
Comments
Post a Comment