2293620 4199056 abc 看出编译器将c3优化指向常量区的"abc"
继续思考:
代码:
#include
using namespace std;
main()
{
char *c1 = "abc";
char c2[] = "abc";
char *c3 = ( char* )malloc(3);
// *c3 = "abc" //error
strcpy(c3,"abc");
c3[0] = 'g';
printf("%d %d %s\n",&c1,c1,c1);
printf("%d %d %s\n",&c2,c2,c2);
printf("%d %d %s\n",&c3,c3,c3);
getchar();
}
输出:
2293628 4199056 abc
2293624 2293624 abc
2293620 4012976 gbc
写成注释那样,后面改动就会崩溃
可见strcpy(c3,"abc");abc是另一块地方分配的,而且可以改变,和上面的参考文档说法有些不一定.
*c3 = "abc";
这句话本来就有问题,编译都通不过
c3是指针变量,所指的内容是char型.而你这句话是想让它所指的内容变成字符串,显然是不对的
c3 = "abc";
这样就没问题了
但此时,c3存储的就是的字符串常量的地址了,所以不能再给c3所指的内容赋值了:c3[0] = 'g';是非法的
此外,函数在压栈,一般是先把参数(arguments)压栈,然后才是返回地址
作者:sunshinewave