C语言——字符串的使用-创新互联

基于string库函数封装过程的研究,引发的相关知识探究:

1、关于字符串的使用:
  (1)char str[n] 即栈区分配 n 个字节的的空间,但是在使用的过程中,会出现超出分配的空间,例如:使用 strcpy 函数将一个字符串长度大于 n 的字符串拷贝在数组 str 中,超过 n 个字节的部分会顺序存储在 str+n 的地址后面,即被拷贝的字符串到了新的地址空间 str 仍旧满足物理上的顺序结构;  

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都做网站、外贸网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的涿鹿网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
char array[10] = "ab";
	char str[] = "i love my country";
	my_strcpy(array,str);
	printf("%s\n", array);

在调试上述代码时,可以顺利运行 my_strcpy ,但是运行到结尾处 ‘ } ’ 时会报错 :

运行时检查失败#2-在变量‘数组’周围的堆栈被破坏.

在调试过程中,也是发现定义一个大小为 10 的数组,在没有数据的位置都是以 ' \0 ' 的形式存在的,而没有分配的地址空间是以 -52'?' 的形式存在,可见是不合法的;但是在 my_strcpy 的过程中 str 访问到了没有被分配的地址空间,编译器也没有报错,仍旧继续进行访问;

联系与反思:

使用 malloc 在堆区申请一块空间,返回空间的首地址,申请的地址是一块物理连续的地址空间,那么既然申请的是一块连续的地址空间,是否也可以越界访问并拥有可写权限;

int* space = (int*)malloc(sizeof(int)*10);
	for (int i = 0; i< 15; i++) {
		*(space + i) = i;
	}

在上述代码中我们可以看到 malloc 申请了一块大小为 sizeof (int)*10 的地址空间,在调试窗口中可以看到这一块空间存储的都是 0 或者随机数,当我们在 for 循环的中访问到第十一个 int 空间时,代码没有报错,继续访问,也有可写权限;

从可以知道定义数组可知,编译器会在代码结尾处报错——变量‘数组’周围的堆栈被破坏,但是在非 malloc 申请的地址空间下操作,编译器未报错;

在后续的操作中——获取未申请的且被修改的空间的地址,用指针指向这一块地址,依旧是可以进行操作;

(2)关于 char *str 、char str [num] 和char str[ ] 三种字符串的定义方式;

char str [num] 是在栈区分配的空间,栈区空间是由系统分配与释放;随着函数结束,系统自己会清除;

char str[ ] 是将存放在静态存储区即常量区中的常量拷贝在数组 str 中;即在堆区申请一块空间进行存储拷贝过来的常量,也就是说此时 str 也就和上述的str[num] 是等价的;

char *str 是将指针 str 指向常量区的常量地址,而静态存储区是不可修改的,只有可读权限,并没有修改权限,故而 char *str 可以打印出来,而不能修改其中的值;

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

本文名称:C语言——字符串的使用-创新互联
当前地址:https://www.cdcxhl.com/article24/ddhsce.html

成都网站建设公司_创新互联,为您提供网站策划响应式网站定制网站用户体验网站设计自适应网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设公司