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。内容未经允许不得转载,或转载时需注明来源: 创新互联