jdbc interface 抖音 transactions xsd cocos2d html5 vue教程 jquery的each遍历方法 matlab复数求模 matlab中axis java 大文件上传 kubernetes官网 python中assert python中import java重写和重载 java字符串替换 java获取现在时间 java字符 linux的find java项目下载 键盘模拟器 飞猪ip 音乐剪辑器下载 视频修复工具 混沌世界隐藏英雄密码 网红照片男 mathcad 系统激活 xlwt 调试工具 无人机数据处理软件 win10画图在哪里 超级好友 繁简体转换 发表评论 jsreplace 如何加入工作组 图片格式转换工具 英雄塔 苹果商店怎么改成中文
当前位置: 首页 > 学习教程  > 编程语言

日常踩坑 尝试修改字符串常量初始化的字符指针变量指向的内容

2021/1/28 23:53:50 文章标签:

先上代码&#xff0c;如下&#xff1a; #include <stdio.h> void copy_string(char from[],char to[]); int main() {char *a "I am a tearch!";char *b "You are a student";printf("string a:%s\nstring b:%s\n",a,b);printf("\…

先上代码,如下:

#include <stdio.h>
void copy_string(char from[],char to[]);
int main()
{
	char *a = "I am a tearch!";
	char *b = "You are a student";
	printf("string a:%s\nstring b:%s\n",a,b);
	printf("\ncopy string a to string b");
	copy_string(a,b);
	printf("\nstring a:%s\nstring b:%s\n",a,b);
	return 0;
}
void copy_string(char from[],char to[])
{
	int i;
	for(i=0;from[i]!='\0';i++) to[i] = from[i];
	to[i] = '\0';
}

编译并运行,结果:
在这里插入图片描述
报错信息:Segmentation fault
“Segmentation fault” means that you tried to access memory that you do not have access to.
大概指的是,你试图访问没有访问权限的内存。
由上可知,程序里也只有倒数第二行里的to[i] = from[i];在访问内存了,并出现非编译异常报错信息。

对面以上错误,我也只是淡淡的作出了回应:“呵,小问题,有头发就可以…”,然而半天过去也没想明白,我丢!

其实,系酱紫的。
在计算机里的内存分区里,一般内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域。

而上面的报错信息涉及到常量区和栈区的错误认识,甚至是不了解。

char *b = "You are a student";

定义的字符指针变量b存放在栈区里,而“You are a student”是字符串常量则是存放在常量区(只读不可写)。b的值是常量数组(系统自动为之开辟数组空间存放)里的首元素地址,b指针指向常量区。正是这样,在调用函数之时,copy_string(a,b) 传入b实参给形参(值传递),此时to[0]指的是b指针指向的常量区,在此并尝试赋予新值from[0]。这样就出现错误了——尝试修改存放在不可写的常量区的内容。

换用字符数组初始化字符变量。
代码:

#include <stdio.h>
void copy_string(char from[],char to[]);
int main()
{
	char *a = "I am a tearch!";
	char *b = "You are a student";
	printf("string a:%s\nstring b:%s\n",a,b);
	printf("\ncopy string a to string b");
	copy_string(a,b);
	printf("\nstring a:%s\nstring b:%s\n",a,b);
	return 0;
}
void copy_string(char from[],char to[])
{
	int i;
	for(i=0;from[i]!='\0';i++) to[i] = from[i];
	to[i] = '\0';
}

结果:
在这里插入图片描述
做了些简单的修改,将原来的指针变量b改为char b[],进而把b赋值给指针变量p。
然而,char b[] = "you are a student"定义了字符数组b并存放在栈区,然后把字符串常量拷贝到字符组b里。所以指针变量p指向的是栈区,调用函数传参(值传递),执行to[0]=from[0],读取常量区字符串常量的值修改栈区里的数值,可操作的。即可达到任务。


本文链接: http://www.dtmao.cc/news_show_650321.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?