首先来看两个程序:
1.
#include <stdio.h>
#include <windows.h>
int main()
{
char* arr="hello world";
strcpy(arr,"hello");
system("pause");
return 0;
}
观察这个程序,乍一看可能会觉得这个程序没什么问题,语法都对着,但是一运行,结果就不是我们所想的了。
程序崩溃了,然后就很多人就会想会不会是strcpy函数在调用的时候出了问题 啊。
那么我们来看第二个程序:
2.
#include <stdio.h>
#include <windows.h>
int main()
{
char arr[]="hello world";
strcpy(arr,"hello");
printf("%s\n",arr);
system("pause");
return 0;
}
程序运行结果如下:
程序正常运行,而且符合我们预期,很显然这个不是strcpy函数的问题。
那这是为什么呢?
我们把目光聚焦到两个程序的不同之处:char* arr="hello world";与char arr[]="hello world";
前者是定义了一个字符指针,而后者是定义了一个字符数组,那么这两者的区别是什么呢?
首先我们要明确一点,在C语言中并不存在字符串类型,有的只是字符串常量,而且字符串常量是存放在静态全局区上的,而一般局部变量,形式参数则是保存在栈区上的。因此在这里字符指针变量arr以及字符数组arr[]都是在栈区上的,而对于char* arr="hello world";而言,仅仅是定义了一个指针并让它指向静态区上的字符串常量"hello world"【即arr上保存的是"hello world"的首字符地址】,而stcpy(arr,"hello");则是要将"hello world"改成"hello",但因为是常量无法修改,所以程序崩溃。
但对于char arr[]="hello world";而言,仅仅是定义了一个字符数组arr[],并将arr[]初始化值为"hello world",而并非将静态区上字符串常量"hello world"移到栈区上的字符数组arr[]当中去,所以这里是可以通过strcpy来进行修改的。