1

i wrote a small prog :

  1 #include<stdio.h>  
  2 main(){  
  3         char* str = "string";  
  4         *str = 'k';  
  5         printf("string is = %s\n",str);
  6 }

This program gets compiled without any error or warnings, but when i run it, it gives segmentation fault. While if i rewrite the 3rd line as : char str[] = "string"; this program works perfectly fine. Can anyone please let me know what is the issue here ??? What is the difference between these two different ways of writing the 3rd line. Any help will be greatly appreciated. thanks.

mezda
  • 3,537
  • 6
  • 30
  • 37

3 Answers3

7
char* str = "string";

This puts the string in read-only memory. It is undefined behavior (usually unpleasant behavior) when you try to modify it with the next line. Try something like

char str[] = "string";

instead.

Duck
  • 26,924
  • 5
  • 64
  • 92
  • 1
    Trying to modify it doesn't always give a segfault, it is an undefined behavior actually; sometimes you get a segfault, others it just works fine. – Fingolfin Feb 12 '12 at 16:54
  • In fact I usually had a BUS ERROR when i was doing this. – Eregrith Feb 12 '12 at 18:26
  • 2
    Well last time I did it my mother-in-law came to visit for a week. Just don't do it. – Duck Feb 12 '12 at 18:49
2
char * str = "string";

declares a pointer which points to an area of memory where the string "string" is stored; it's undefined behavior to write in this area of memory, and it usually results in a crash.

Instead, you should use:

char str[]="string";

which declares a string local to your function, that is initialized to the value "string". Since the memory you are using for this string is local to your procedure you can alter it however you want.

Matteo Italia
  • 123,740
  • 17
  • 206
  • 299
  • Thanks for your replies. Can anyone please let me know that where the "string" will be stored in these two cases( char* str = "string"; and...char str[] ="string";). Whether it will be data segment,text segment or any other section ? And further how can i check this in gdb that where it is stored ? – mezda Feb 13 '12 at 18:01
0
I also executed the given code..

  1 #include<stdio.h>  
  2 main(){  
  3         char* str = "string";  
  4         *str = 'k';  
  5         printf("string is = %s\n",str);
  6 }

 But there is no such error. 

 Following output is shown....

 String is=Ktring

 A segmentation fault, bus error, or access violation is generally an attempt 
 to access memory that the CPU cannot physically address. So in my opinion it's   
 completely depends on execution.

 thanks...
Aryan
  • 143
  • 1
  • 3