问题:
程序编译通过,运行异常终止。
进入调试模式,报段错误。
分析:
逐行调试,在为char指针所指内容修改时出错。
原因:
char *c = "abc"
此时,无法根据指针来修改字符串内容。
//example 1:
char str[12] = "Hello"; //字符串用数组开辟的,它是可以改变的变量。
char *p = str;
*p = 'h'; //改变第一个字母
//example 2:
char *ptr = "Hello"; //字符串则是一个常量,也就是字面值。ptr只是指向它的指针而已,而不能改变指向的内容。
*ptr = 'h'; //错误
example 1:实际上先是在文字常量区分配了一块内存放"abc",然后在栈上分配一地址给c1并指向这块地址,然后改变常量"abc"自然会崩溃。
example 2:然而char c2[] = "abc",实际上abc分配内存的地方和上者并不一样
深入原因:
前提 程序内存分布概述
(引自:http://blog.csdn.net/wallwind/article/details/7210474)
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区
举例说明:
//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"优化成一个地方。
}