aks
aks

Reputation: 4815

Why can't I use this code to overwrite a string?

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

Answers (4)

Brian R. Bondy
Brian R. Bondy

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

Ree
Ree

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

kennytm
kennytm

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

anon
anon

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

Related Questions