马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 风车呼呼呼 于 2022-4-22 19:45 编辑
通过malloc申请的空间,为什么通过指针能访问到申请空间大小以外的空间
以下用malloc(2)为例
申请2字节空间,指针能够对第3、4字节空间进行操作
考虑到申请空间之外的空间可能不属于必须自己手动释放的范围,但经过测试,free之后,之前对第3、4字节空间的赋值一同被清除了
之后尝试通过指针修改较远一些的空间,再次free后,却又并没有被清除数据
上述,产生了一系列矛盾和疑问:
malloc申请的空间之外连续的空间是否属于malloc的作用范围,
如果不属于,又为何能被free影响
如果属于,范围又有多大呢?同时我们规定申请的字节数岂不是没有意义
以下为个人验证过程及结果:#include <stdio.h>
#include <stdlib.h>
int main(void){
char *ptr = NULL;
int i;
ptr = (char *)malloc(2);
for(i = 0; i < 14; i++){
printf(" address of ptr[%d]: %p\n", i, &ptr[i]);
}
ptr[0] = 'A';
ptr[1] = 'B';
ptr[2] = 'C';
ptr[3] = 'D';
printf("ptr[13]:%d\n", ptr[13]);
ptr[13] = 'X';
for(i = 0; i < 14; i++){
printf("%c\n", ptr[i]);
}
printf("address ptr: %p\n", ptr);
free(ptr);
printf("释放后:\n");
for(i = 0; i < 14; i++){
printf("%c\n", ptr[i]);
}
printf("address ptr: %p\n", ptr);
return 0;
}
address of ptr[0]: 0x1a7c010
address of ptr[1]: 0x1a7c011
address of ptr[2]: 0x1a7c012
address of ptr[3]: 0x1a7c013
address of ptr[4]: 0x1a7c014
address of ptr[5]: 0x1a7c015
address of ptr[6]: 0x1a7c016
address of ptr[7]: 0x1a7c017
address of ptr[8]: 0x1a7c018
address of ptr[9]: 0x1a7c019
address of ptr[10]: 0x1a7c01a
address of ptr[11]: 0x1a7c01b
address of ptr[12]: 0x1a7c01c
address of ptr[13]: 0x1a7c01d
ptr[13]:0
A
B
C
D
X
address ptr: 0x1a7c010
释放后:
X
address ptr: 0x1a7c010
这个问题我也想了。
ptr[13]的值是通过指针越界赋值的。释放ptr后,还是通过指针ptr访问到ptr[13]
思考结果:
1.指针ptr释放后,但指针变量ptr没有被删除,只是释放指针ptr指向的内存空间。
释放后:
v
address ptr: 007618B8
这个时候指针ptr是一个野指针。误以为ptr是个合法的指针而在接下来程序中错误的使用它,既然知道不合法,就不应该再通过ptr取错误访问。虽然错误访问,但C语言不做检查。
2.为避免野指针导致非法访问,free(ptr)后,应ptr=NULL
3.程序结果出现'v',野指针访问出现的未知结果
|