An important point that's inferred but not stated explicitly:
Based on your question, I'm guessing that you're fairly new to programming in C, so I'd like to explain a little more about your situation. Forgive me if I'm mistaken; C can be hard to learn mostly because of subtle misunderstanding in underlying mechanisms so I like to make things as plain as possible.
As you know, when you write out your C program the compiler pre-creates everything for you based on the syntax. When you declare a variable anywhere in your code, e.g.:
int x = 0;
The compiler reads this line of text and says to itself: OK, I need to replace all occurrences in the current code scope of x
with a constant reference to a region of memory I've allocated to hold an integer.
When your program is run, this line leads to a new action: I need to set the region of memory that x
references to int
value 0
.
Note the subtle difference here: the memory location that reference point x
holds is constant (and cannot be changed). However, the value that x
points can be changed. You do it in your code through assignment, e.g. x = 15;
. Also note that the single line of code actually amounts to two separate commands to the compiler.
When you have a statement like:
char *name = "Tom";
The compiler's process is like this: OK, I need to replace all occurrences in the current code scope of name
with a constant reference to a region of memory I've allocated to hold a char
pointer value. And it does so.
But there's that second step, which amounts to this: I need to create a constant array of characters which holds the values 'T', 'o', 'm', and NULL
. Then I need to replace the part of the code which says "Tom"
with the memory address of that constant string.
When your program is run, the final step occurs: setting the pointer to char
's value (which isn't constant) to the memory address of that automatically created string (which is constant).
So a char *
is not read-only. Only a const char *
is read-only. But your problem in this case isn't that char *
s are read-only, it's that your pointer references a read-only regions of memory.
I bring all this up because understanding this issue is the barrier between you looking at the definition of that function from the library and understanding the issue yourself versus having to ask us. And I've somewhat simplified some of the details in the hopes of making the issue more understandable.
I hope this was helpful. ;)