ERROR:C++ 字符指针引起的段错误

来源:互联网 发布:按键精灵节奏大师源码 编辑:程序博客网 时间:2024/05/16 07:32

问题:

程序编译通过,运行异常终止。

进入调试模式,报段错误。


分析:

逐行调试,在为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"优化成一个
地方。
}



 




0 0
原创粉丝点击