views:

103

answers:

2

Consider the following code:

char* str = "Hello World";
memcpy(str, "Copy\0", 5);

A segmentation fault occurs during the memcpy. However, using this code:

char str[12];
memcpy(str, "Hello World\0", 12);
memcpy(str, "Copy\0", 5);

The program does not produce a segmentation fault.

Does the problem arise from allocating the memory on the stack versus the data section?

+6  A: 

When you use a string literal in gcc the value is placed in read-only memory and cannot be modified. Trying to modify it leads to undefined behaviour. Usually you will get a segmentation fault on Linux when you try to do this.

The second example works because you aren't modifying the string literal, you are modifying a copy of it that is stored in variable that is not read-only.

Mark Byers
+1 The standard says (6.4.5/6) "If the program attempts to modify such an array, the behavior is undefined." There is no mention of read-only memory though (and it may well be right for Linux and gcc)
pmg
The implication of "Hello, World" is that the array is a const char *. Of course you can point to a const char * with a regular char *. If you turn up gcc's warning level, it will complain about this of course. The data is still unmodifiable, however.
KFro
@pmg: When the standard says certain behavior is undefined, that means (at least as far as the standard is concerned) a conforming implementation is allowed to do *ANYTHING*. Reformat the hard drive, trigger thermonuclear Armageddon, etc. If all the programmer is getting is a Segmentation Fault she's getting off easy.
supercat
In many cases the "undefined behavior" cases are those that needs hardware support. In this case it is support for memory access rights.
ruslik
@KFro: String literals are of type `char [n]` in C, not `const char [n]`. The situation is different in C++.
caf
+1  A: 
char* str = "Hello World";

and

char str[12];

are two very different things. One allocates a pointer on the stack and an array in read-only "code segment". The pointer then points at the array. The other allocates the entire array on the stack, and there is no pointer.

Arkadiy
Can some one confirm this please. str is it stored in the code segment ? I think its in the data segment.
mousey
@Arkadiy actually it's called `rdata`.
ruslik
Sorry, bad wording on my part. The static constant data and code segment are separate segments. But the memory in both of them cannot be modified.
Arkadiy