In this statement:
char *a = "string1"
What exactly is string literal? Is it string1
? Because this thread What is the type of string literals in C and C++? says something different.
Up to my knowledge
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Please add some details other than above mentioned points. Thanks.
Debug Output Showing error in a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: file ddd.c, line 4.
(gdb) r
Starting program: /home/jay/Desktop/MI/chararr/a.out
Breakpoint 1, main () at ddd.c:4
4 {
(gdb) n
6 char *a = "string1";
(gdb) n
7 char b[] = "string2";
(gdb)
9 a[0] = 'Y';
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400595 in main () at ddd.c:9
You can look at string literal as "a sequence of characters surrounded by double quotes".
This string should be treated as read-only and trying to modify this memory leads to undefined behavior. It's not necessarily stored in read only memory, and the type is char[]
and not const char[]
, but it is still undefined behavior. The reason the type is not const
is backwards compability. C didn't have the const
qualifier in the beginning. In C++, string literals have the type const char[]
.
So how come that you get segmentation fault?
char *ptr = "string literal"
makes ptr
to point to the read-only memory where your string literal is stored. So when you try to access this memory: ptr[0] = 'X'
(which is by the way equivalent to *(ptr + 0) = 'X'
), it is a memory access violation.On the other hand: char b[] = "string2";
allocates memory and copies string "string2"
into it, thus modifying it is valid. This memory is freed when b
goes out of scope.
Have a look at Literal string initializer for a character array
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With