From: Markus S. <MS...@de...> - 2009-08-25 08:42:13
|
> Hello! > > I have some trouble which can be summarized with this simple program: > > $ cat scan.c > #include <stdio.h> > int main(void) > { > void *p; > char buf[100]; > > snprintf(buf, sizeof(buf), "%p", &p); > printf("%s\n", buf); > sscanf(buf, "%p", &p); I'm not 100% sure here, but I think this is one pointer indirection too much. '*p' is the variable to actually store the pointer in. sscanf needs the pointer to '*p' to be able to store the value there. The pointer to '*p' is simply 'p', and not '&p'. > printf("%p\n", p); If I'm right with the above, then the value sscanf read from 'buf' was stored in '*p'. So printf now needs '*p' as an argument, not 'p'. > > return 0; > } > $ gcc -o scan scan.c > $ ./scan > 0x22ff6c > 00000000 >From your second mail: > Oops, sorry. Thinking about it some more, I think I expect > 0022FF6C > 0022FF6C No, I think you get the '0x' added. From the printf man page: p The void * pointer argument is printed in hexadeci mal (as if by %#x or %#lx). And '#' means: # The value should be converted to an ''alternate form''. ... ... For x and X conversions, a non-zero result has the string '0x' (or '0X' for X conversions) prepended to it. ... ... Mit freundlichen Grüßen / Kind regards Markus Selve ------------------------------------------------------------------------------------------------------------------------------------------- IBM Deutschland Schoenaicher Str. 220 71032 Boeblingen Phone: +49-7031-16-5143 E-Mail: ms...@de... ------------------------------------------------------------------------------------------------------------------------------------------- IBM Deutschland Research & Development GmbH / Vorsitzender des Aufsichtsrats: Martin Jetter Geschäftsführung: Erich Baier Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294 |