简体   繁体   中英

Program aborts when using strcpy on a char pointer? (Works fine on char array)

I'm perplexed as to why the following doesn't work:

char * f = "abcdef";
strcpy(f, "abcdef");
printf("%s",f);

char s[] = "ddd";
strcpy(&s[0], "eee");
printf("%s", s);

In both examples strcpy received a char * yet on the first example it dies a horrible death.

"abcdef" and "ddd" are string literals which may reside in a read-only section of your address space. char s[] = "ddd" ensures this literal is copied to stack - so it's modifiable.

char * f = "abcdef"; defines a char pointer to "abcdef" which is located in read-only area so you can't write to this place

char s[] = "ddd"; defines a char array on the stack which is writable.

In the first example, you have a pointer to a string literal. This pointer should really be const char * , because any attempt to modify a string literal is undefined behaviour. However, for legacy reasons allows you to use a char * to point at it. But you still shouldn't be trying to modify it.

In the second version, you have a bog-standard array, whose contents happen to be initialised to be equivalent to your string. This is modifiable, as it's your array.

The first example is a char * to a character literal (a literal is "something" ). Character literals are read-only, and attempting to write to them can result in crashes. Your first pointer should really be const char *f = "abcdef"; , which strcpy won't take.

The statement char * f = "abcdef" assigns a point in memory to the literal string "abcdef", however it will refuse to let you modify its contents until the memory is dynamically allocated - it's equivalent to a const char .
All you're doing is creating a pointer in memory and then writing over the next 6 bytes, which is illegal in C.

String literals are considered readonly by most compilers, so the memory where they reside can be marked as readonly, resulting in a runtime error.

To make it work, do the following:

char * f = strdup("abcdef");
strcpy(f, "abcdef");
printf("%s",f);
free(f);

This creates a modifiable copy of the string in the heap memory, which needs to get freed at the end of your program of course.

You, refer to this

link, for how to use strcpy for char pointers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM