Segmentation fault (core dumped) in a simple C code

前端 未结 3 529
天涯浪人
天涯浪人 2021-01-20 04:37

I am new in C. I am referring to the book \"The C Programming Language\" by Brian W Kernighian and Dennis Ritchie. There is a code for pointer increment and assignment give

相关标签:
3条回答
  • 2021-01-20 04:55

    The problem is that printf expects the first parameter to be a char *, that is, something that points to a character, or the address of a character. When you say printf(*s) you're passing it an actual character, i.e. a number from 0 to 255 or -128 to 127, and the program is going to treat that number as an address, which isn't going to be a valid address on your system.

    0 讨论(0)
  • 2021-01-20 05:07

    s and t are both string literals, and you can't modify a string literal. But this piece of code

    *s++ = *t++
    

    will modify s, which causes segmentation fault.

    To fix it, use a char array. I also modified the printf part to make it legal.

    #include<stdio.h>
    
    int main()
    {
        char arr[] = "Goal";
        char *s = arr;
        char *t = "Home";
        while(*s++ = *t++) 
            ;
        printf("%s\n", arr);
        return 0;
    }
    

    However, I think this program is better done using an individual function to copy the string, the program will look clearer.

    #include<stdio.h>
    void my_strcpy(char *s, char *t);
    
    int main()
    {
        char s[] = "Goal";
        char *t = "Home";
        my_strcpy(s, t);
        printf("%s\n", s);
        return 0;
    }
    
    void my_strcpy(char *s, char *t)
    {
        while(*s++ = *t++) 
            ;
    }
    
    0 讨论(0)
  • 2021-01-20 05:11

    When ever we say *s = "hello" , s is pointing to an address which is present in text segment("hello" goes into text segment). So obviously changing the value of text segment results in SEGV termination.

    And for s[] = "hello" if we do *s++, we are incrementing (modifying) the base address so we got "lvalue required as increment operand" error.

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