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语言——字符串的使用-创新互联
标题URL:http://myzitong.com/article/ddhsce.html