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"优化成一个地方。
}
- ERROR:C++ 字符指针引起的段错误
- 一个指针引起的段错误
- C语言指针段错误
- 段错误 (核心已转储) 字符指针 ubuntu
- 字节未对齐引起的段错误
- sscanf 函数引起的段错误
- c语言中一个指向指针的指针所引起的错误
- Jellybean上relro引起的 SEGV_ACCERR段错误问题
- Jellybean上relro引起的 SEGV_ACCERR段错误问题
- 函数栈溢出引起的段错误segmentation fault
- 函数栈溢出引起的段错误segmentation fault
- extern "C" 引起的 error C2059
- 指针 段溢出 段错误的自我学习
- Presentation Error是由哪些字符引起的?
- Websphere中引起的空指针错误的解决办法小结
- 调用类函数指针引起的编译器错误 C2064
- linux c 字符数组指针和字符串指针(区别代码段)
- C中遇到的段错误
- GSM压缩/ 解压实现
- Linux 开机启动websphere 服务
- 林达华推荐的几本数学书
- 黑马程序员——OC基础—-----一个简单OC程序的分析
- 如何在多台机器上共享IOS证书
- ERROR:C++ 字符指针引起的段错误
- 2015.03.04学习笔记
- HDU 2048--神、上帝以及老天爷【错排】
- spring cas 配置小知识
- GStreamer 1.0 运行时环境变量设置
- Qt 5.3.2在周立功M3352开发板的移植记录
- canvas之刮刮卡效果
- YT15-HDU-LELE的涂色难题
- js传值乱码解决办法