指针为何不能修改其指向的常量字符串
2017-06-16 08:56
197 查看
#include<stdio.h> void trans_string(char *string) { *string = 'm'; } void main() { char string[] = "abcdefg"; trans_string(string); printf("*string:%c,string:%s\n",*string,string); char *str = "abcdefg"; trans_string(str); printf("*str:%c\n",*str); }
程序运行结果:
*string:m,string:mbcdefg 段错误 (core dumped)
代码中第二次调用str给字符串赋值出现段错误
问题原因:指针指向常量字符串(位于常量存储区),常量字符串的内容是不可以被修改的,企图修改常量字符串的内容而导致运行错误。所以这个问题出现的原因是char*str=”abcdefg”,赋值的是字符串常量,存储在常量存储区,而常量存储区的内容是无法修改的。
如果使用数组来代替的话,数据就存储在堆栈空间,堆栈空间的内容是可以修改的,就不会出现运行时错误。
程序的内存分配:
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。 - 程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
上代码:
//main.c 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字节的区域就在堆区。 }
相关文章推荐
- 指向字符串的指针为何不能用来修改此字符串
- 指向字符串的指针为何不能用来修改此字符串(c语言)http://blog.sina.com.cn/s/blog_68ff96b70101him1.html
- 指针指向的字符串不能修改
- 为什么不能修改指向字符串的指针
- 指针到底能不能修改其指向的常量字符串?&向NULL地址copy数据
- 关于字符串指针指向内容不能修改的问题
- 指针指向常量的场合,不能试图通过修改指针指向的内容来修改常量
- 指针到底能不能修改其指向的常量字符串?
- 指针就算指向了常量也不能修改这个常量
- 指针到底能不能修改其指向的常量字符串?
- char * 指向的字符串不能修改
- const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改
- [*注意指向常量的字符指针变量*]用指向常量的字符指针变量和字符数组方法把字符串a复制到字符串b中
- 定义字符指针数组分别指向5个字符串常量,从小到大输出字符串内容
- 对字符指针指向字符串不能更改
- 修改常量指针所指向变量的方法
- 指向字符串常量的指针
- 关于字符串指针不能修改的疑问
- 绝对不能通过指针修改常量!!!!!!
- 不能通过键盘输入一个字符串,并使未初始化的指针指向它