看程序员面试笔记看到一段代码,记录一下:
int main(){
char* const str="apple";
*str="orange";
cout<<str<<endl;
getchar();
}
这段代码有两个问题:
1.str是char* 类型,要给str赋值要写str=“orange”;
2.如果只把str前的*号去掉,程序还是不对的。str是常量指针 指针常量,开始指向apple串,这个串是在内存的常量区的,那么str="orange"后str就指向了常量区另一块内存,这是不允许的。
要改成正常的char指针才可以正常改动其存储的数据。
char* str="apple";
str="orange";
我又写了个代码:
int main(){
char* str="apple";
*str='x';
cout<<str<<endl;
getchar();
}
运行错误。
再写一个:
证实了我的想法:char[]数组开的空间是在栈的,apple字符串直接放到数组空间里去,所以第二个图是可以的。
char*的这个指针开的空间也在栈,但char * str=“apple”;其中的执行顺序应当是先将apple加入到内存的常量区,然后把这个常量区里的apple串的地址赋给了str。所以当我们改str处的字符,就相当于直接改动内存常量区,这显然不允许。
贴一个相关的回答:
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}