Below is an exceedingly simple example. It compiles fine using gcc on Mac OS X (Snow Leopard). At runtime it outputs Bus error: 10. What's happening here?
char* a = "abc";
a[0] = 'c';
Your code sets a
to a pointer to "abc"
, which is literal data that can't be modified. The Bus error occurs when your code violates this restriction, and tries to modify the value.
try this instead:
char a[] = "abc";
a[0] = 'c';
That creates a char array (in your program's normal data space), and copies the contents of the string literal into your array. Now you should have no trouble making changes to it.
You are trying to modify a string constant. Use this instead:
char a[] = "abc";
a[0] = 'c';
This
char* a = "abc";
relies on a dangerous implicit conversion from const char[]
(the type of a string literal) to char*
. (In C++ this conversion has been deprecated for more than a decade. I don't know about C, though.)
A string literal must not be altered.
char *str = "string";
In such a case it is treated as a read only literal. It is similar to writing const char *str = "string"
. Which is to say that the value pointed to by the pointer str
is a constant. Trying to edit will result in BUS ERROR.
char *a = "abc"
is a constant string stored in the .data
section of an ELF binary. You are not allowed to modify this memory and if you do you incur undefined behavior in some cases it will give no error but not modify the memory in your case you get a bus error because you are attempting to access memory that you normally cannot (for writing purposes).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With