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
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.
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++)
;
}
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.