1、如下示例程序中:
示例代码
// Win32_test.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char *a = "hello";
char *b = "hello";
char s[] = "hello";
//*b = 'b'; error
s[0] = 'b';
//a,b指针指向的是常量区的数据"hello”,而s[]在栈中分配内存并复制了
//常量数据"abcdef”的拷贝。所以,我们修改字符数组s,实际上只是修改的在
//栈中的拷贝,而没有修改文本常量区的数据。
if (a == b)
cout << "a == b" << endl; //输出a == b
if ("test" == "test")
cout << "test == test" << endl; //输出test == test
return 0;
}
#include <stdio.h>
int main()
{
char *p="abcdef"; //should be : const char * p = "abcdef";
//...
}
/*
apparently, var p is allocated from current stack frame,
the string constant literal: "abcdef" lies in the .rdata segment,
if u use the expresstion: p[2]='W', which will change the rdata's data,
os refuse this action, but the compiler and linker pass.
so a running-error will popup.
*/
//another ex;
#include <stdio.h>
int main()
{
char s[]="abcdef";//s在栈,“abcdef”在数据区
//...
}
/*
this behavior is okay,
this memory from s is alloated from the current stack frame,
r-vale "abcdef" will be copies to that place that is already allocated
through above step. notice! u change only the copy NOT origin, so this program
may support 'reload'.
可能我们觉得他们不会相等,实际是相等的,为什么?因为他们是字符串常量,存储在内存中的文字常量区(文字常量区—常量字符串就是放在这里的,程序结束后由系统释放)[2]。
2、在[1]中,作者作出了相反的答案。但至少在我的电脑上,VS2008中,执行的是如程序中的结果,与[1]中所述有区别。
3、在[3]的CSDN论坛的帖子中,对这个问题进行了讨论。
示例代码
//main.cpp
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
intb;栈
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"优化成一个地方。
}
参考
[1] http://www.soidc.net/articles/1215485053486/20061202/1215945550035_1.html
[2] http://blog.163.com/zhoumhan_0351/blog/static/39954227200910288840539/
[3]http://topic.csdn.net/u/20081106/23/02545709-f008-41c5-86d0-d2eb8aa1e162_2.html