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

后端 未结 4 899
刺人心
刺人心 2020-12-11 11:50

Code:

#include \"stdio.h\"
#include \"string.h\"

int main()
{
  char *p = \"abc\";
  printf(\"p is %s \\n\", p);
  return 0;
}

O

相关标签:
4条回答
  • 2020-12-11 11:56

    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";
    
    0 讨论(0)
  • 2020-12-11 11:57

    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);
    
    0 讨论(0)
  • 2020-12-11 12:08

    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.

    0 讨论(0)
  • 2020-12-11 12:17

    p is basically just a pointer to read-only data (which is "abc" in your case). You cannot overwrite that with "def".

    0 讨论(0)
提交回复
热议问题