C - Printing a char*
Why does this result in a segmentation fault? And why, if I use %d instead of %s, I get a useless 49? char *str = "12345"; printf("%s", *str);
*str point to the first charecter of "12345". So str='1', when %d is used to display then it is converted to intiger or ascii value 49. But with accessing %s, the str is pointer of char*, the location of string in memory, cannot be converted to string type.. Since it point to single value but accessing more than that causes segmentation error... Edit: %s takes that *str value as address for retrieving string.. So cause segment error.. For some more clarity, see ~ swim ~answer below..
You get 49 because it only reads 1 (as char) and the ascii of '1' is 49. If you change that 1 to 0 for example, when you print %d it will print out 48 as the ascii of '0' (Character 0, not integer 0). For %s, it gives you segmentation fault because of the parameter, when you put *str it means str at the first. Pointer is "pointing", try to change it to %c to see what I mean, and if you want to print it as string, use str instead of *str. Oh and also try these, printf ("%d", *str); printf ("%d", *str+1); printf ("%d", *str+2); You can try to change %d to %c to understand better my explanation because I'm kinda bad to explain something when its not face to face.
*str which is '1' has an ASCII value of 49 in decimal. So, %d prints 49. If you use %s it will try to print a null terminated string of chars starting at memory address 49 (in decimal). This address is most likely not accessible, causing the segmentation fault.
~ swim ~ Yes. Illigal, unavailable access.. My meaning the same.. Is there need any changes? I think, It should be "incompatible" , instead of "cannot be converted"...! Right?
~ swim ~ Thanks for letting me know that..
Dont know about segmentation but I can tell you about the 49. Characters are stored in computers using their ascii value. An ascii is an integer. When you use %d, the compiler gives you the integer value stored in the char.
Please look into my correction for your code.