易犯的错误:C指针指向内存空间的常量区
2016-12-15 21:53
387 查看
根据下面语句写出结果:
char* s = “AAA”;
printf(“%s”, s);
s[0] = 'B';
printf(“%s”, s);
看到上面的短程序,或许我们会觉得显而易见,这里指针s指向了AAA,存放的是AAA的地址,所以第一个打印的结果为AAA,s[0]代表的是指向字符串AAA的首地址,所以会觉得第二个打印的结果就是BAA,即将第一个字符更改为了B。
然而在将上面的程序进行验证时,编译执行后发现只有第一个打印正确,接着是出现“段错误”!
这是因为指针虽然指向了AAA,但是AAA为字符串,存放在内存空间中的常量区(数据段的rodata段)。解释到这里我们就可以很容易的明白段错误的原因。对于常量的值是不可修改的,这也是非常容易因为不去考虑其存储空间而犯的错误。在此引以为戒,避免再次犯这样的错误!
char* s = “AAA”;
printf(“%s”, s);
s[0] = 'B';
printf(“%s”, s);
看到上面的短程序,或许我们会觉得显而易见,这里指针s指向了AAA,存放的是AAA的地址,所以第一个打印的结果为AAA,s[0]代表的是指向字符串AAA的首地址,所以会觉得第二个打印的结果就是BAA,即将第一个字符更改为了B。
然而在将上面的程序进行验证时,编译执行后发现只有第一个打印正确,接着是出现“段错误”!
这是因为指针虽然指向了AAA,但是AAA为字符串,存放在内存空间中的常量区(数据段的rodata段)。解释到这里我们就可以很容易的明白段错误的原因。对于常量的值是不可修改的,这也是非常容易因为不去考虑其存储空间而犯的错误。在此引以为戒,避免再次犯这样的错误!
相关文章推荐
- C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 释放掉指针P所指向的内存空间,继续读取指针P的值会报什么错
- C++输出字符型指针指向内存空间的地址
- 改变指针指向的字符内容、动态分配字符型指针变量内存空间
- 在64位系统下,指向int型的指针占的内存空间多大?
- “返回指向栈空间的指针”的错误
- 常量指针运用, 指针和数组名的赋值,以及各自的内存空间问题 浅谈 !
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- C++类中静态STL容器中的指针所指向的动态内存空间如何释放!
- C语言之指针专题一:指针变量和指针所指向的内存空间是两个不同的概念
- 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。
- C语言之指针专题一:指针变量和指针所指向的内存空间是两个不同的概念
- c语言中定义结构体指针并指向一片内存空间和直接定义一个结构体变量的区别 Node *p=(Node *)malloc(sizeof(Node)); 和 Node p 两个有什么区别??? Node是一
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- 习题 8.19(1) 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。
- 指向指针的指针(**)做为参数时,内存分配问题探索
- 指向常量的指针,常量指针,指向常量的常量指针
- 常量指针、指针常量、指向常量的常量指针
- 关于编译错误--提领指向不完全类型的指针