ZqrFerrari
努力学习,开心生活
代码
#include <iostream>
using namespace std;
void main()
{
   
char *c1 = "abc";
   
char c2[] = "abc";
   
char *c3 = ( char* )malloc(3);
   c3 
= "abc";

   
//*c1 = "aaa";                
   
//strcpy(c3,"aaa");
   
//c3[0] = 'g';
   
// 此处c1、c3均指向字符常量区,c3以前指向在堆上分配的3个字节
   
// 的空间,但是此语句执行后,c3被重定向,指向了文字常量区,c3指针变量(4字节)本身在堆栈内。    
   
// 执行c3="abc"; 后,不可以采用c3[1] = ‘x’修改字符串了。因为文字常量去的字符串是不能修改的。

   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 4199056 abc

  char *c1 = "abc"; 实际上先是在文字常量区分配了一块内存放"abc",然后在栈上分配一地址给c1并指向这块地址,然后改变常量"abc"自然会崩溃。然而char c2[] = "abc",实际上"abc"存储的地方和上者并不一样,它也在栈上。可以从4199056 2293624看出,完全是两块地方,推断4199056处于常量区,而2293624处于栈区。
   从2293628 2293624 2293620 这段输出看出三个指针分配的区域为栈区,而且是从高地址到低地址。
   从2293620 4199056 abc 看出编译器将c3优化成,C1指向的常量区的同一个 "abc"。

posted on 2010-06-09 16:04  赵情融  阅读(276)  评论(0编辑  收藏  举报