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 ,但是运行到结尾处 ‘ } ’ 时会报错 :

C语言——字符串的使用_第1张图片

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

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

C语言——字符串的使用_第2张图片C语言——字符串的使用_第3张图片

联系与反思:

使用 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 空间时,代码没有报错,继续访问,也有可写权限;

C语言——字符串的使用_第4张图片C语言——字符串的使用_第5张图片

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

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

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

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

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

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

 

 

 

你可能感兴趣的:(c语言,开发语言)