char * 与 char[] 的区别
直接上代码:
#include <cstring>
int _tmain(int argc, _TCHAR* argv[])
{
char *a = "xxxxxxxxxxxx";
char b[] = "xxxxxxxxxxxx";
int i = 10;
int cmp = strcmp(a,b);
if (cmp == 0)
{
printf("%s\t%s\n",a,b);
}
//memcpy((void *) a,(void *) b,10); 函数里修改了 *a 的值,会崩溃
//a[0] = 'a';//会崩溃
b[0] = 'a';
printf("%s\n",b);
printf("&(*a)=%x\t&b=%x\t&i=%x",&(*a),b,&i);
return 0;
}
结果是:
a 和 b 打印出来是完全一样的,但是 有几点 是不一样的:
1. a 是指针 ,他可以 重新指向 另一个字符串,而b 是一个 地址常量,指向的空间不可变。
2.
char *a = "xxxxxxxxxxxx";
char b[] = "xxxxxxxxxxxx";
两个 "xxxxxxxxxxxx" 不在 同一片 存储 空间里。
第一个 的地址 是 常量地址空间,第二个的地址 和 整形变量 i 的存储空间一致,在一个栈区。
所以导致 a[0] = 'a' 会崩溃 ,b[0] = 'a' 不会。
第2点扩展:在使用C标准库的一些函数里,如果修改了 *a 的内容 ,程序会崩溃。
例如 strcpy(a,b) ,memcpy(a,b) 而 strcmp 没有改变 *a 的内容,不会产生崩溃。