Reputation: 4815
Code:
#include "stdio.h"
#include "string.h"
int main()
{
char *p = "abc";
printf("p is %s \n", p);
return 0;
}
Output:
p is abc
Code:
#include "stdio.h"
#include "string.h"
int main()
{
char *p = "abc";
strcpy(p, "def");
printf("p is %s \n",p);
return 0;
}
Output:
Segmentation fault (core dumped)
Could someone explain why this happens?
Upvotes: 2
Views: 5076
Reputation: 347256
Because p is pointing to read only memory.
Overwriting data that p points to results in undefined behavior. A string literal is any string you specify explicitly in quotes. All string literals are read only. (Note: You can use a string literal to initialize a char array.)
You need to instead allocate your own buffer like this:
char buffer[4];
strcpy(buffer, "def");
printf("buffer is %s \n", buffer);
Upvotes: 3
Reputation: 6211
p
is basically just a pointer to read-only data (which is "abc" in your case). You cannot overwrite that with "def".
Upvotes: 2
Reputation: 523334
Because p
points to a read-only memory region (__TEXT segment) which contains the string "abc
".
As you strcpy
it, a read-only memory region is going to be overwritten, which is illegal. So the kernel will SegFault your program.
If you want writable memory, you need to allocate it on the stack
char p[1024] = "abc";
or on the heap
char* p = malloc(1024);
...
free(p);
or in the __DATA segment (i.e. a global variable)
static char p[1024] = "abc";
Upvotes: 5
Reputation:
In your code:
char *p="abc";
p points to a string literal - you are not allowed to change string literals, which is what your call to strcpy is trying to do. Instead, make p an array:
char p[] = "abc";
which will copy the literal into something that you are allowed to modify.
Upvotes: 8