开发者

changing one char in a c string

I am trying to understand why the following code is illegal:

int main ()
{
    char *c = "hello";
    c[3] = 'g'; // segmentation fault here
    return 0;
}

What is the compiler doing when it encounters char *c = "hello";?

The way I understand it, its an automatic array of char, and c is a pointer to the first char. If so, c[3] is like *(c + 3) and I should be able to make the assignment.

J开发者_StackOverflow社区ust trying to understand the way the compiler works.


String constants are immutable. You cannot change them, even if you assign them to a char * (so assign them to a const char * so you don't forget).

To go into some more detail, your code is roughly equivalent to:

int main() {
  static const char ___internal_string[] = "hello";
  char *c = (char *)___internal_string;
  c[3] = 'g';
  return 0;
}

This ___internal_string is often allocated to a read-only data segment - any attempt to change the data there results in a crash (strictly speaking, other results can happen as well - this is an example of 'undefined behavior'). Due to historical reasons, however, the compiler lets you assign to a char *, giving you the false impression that you can modify it.

Note that if you did this, it would work:

char c[] = "hello";
c[3] = 'g'; // ok

This is because we're initializing a non-const character array. Although the syntax looks similar, it is treated differently by the compiler.


there's a difference between these:

char c[] = "hello";

and

char *c = "hello";

In the first case the compiler allocates space on the stack for 6 bytes (i.e. 5 bytes for "hello" and one for the null-terminator.

In the second case the compiler generates a static const string called "hello" in a global area (aka a string literal, and allocates a pointer on the stack that is initialized to point to that const string.

You cannot modify a const string, and that's why you're getting a segfault.


You can't change the contents of a string literal. You need to make a copy.

#include <string.h>

int main ()
{
    char *c = strdup("hello");  // Make a copy of "hello"
    c[3] = 'g';
    free(c);
    return 0;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜