|
发表于 2022-4-22 21:04:22
|
显示全部楼层
1. char *ptr = NULL; //ptr是一个指向char类型的指针变量,既然是变量肯定有地址,只不过初始化地址为空
2. ptr = (char *)malloc(2); //指针变量指向2字节的连续空间首地址,ptr不是一个地址块,而且ptr的地址已经不为空了
3. 指针ptr能够对第3、4字节空间进行操作,因为C语言不检查指针越界问题,靠程序员自己把控
4. “free之后,之前对第3、4字节空间的赋值一同被清除了之后尝试通过指针修改较远一些的空间,再次free后,却又并没有被清除数据”。free释放的是指针ptr指向的2字节空间,通过指针ptr取访问第3、4字节空间是不可行的。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *ptr = NULL;
int i;
printf(" address of ptr: %p\n", ptr);
printf(" address of ptr's size(Byte): %d\n", sizeof (ptr));
ptr = (char *)malloc(2);
for (i = 0; i < 4; i++)
{
printf(" address of ptr[%d]: %p\n", i, &ptr[i]);
}
ptr[0] = 'A';
ptr[1] = 'B';
ptr[2] = 'C';
ptr[3] = 'D';
for (i = 0; i < 4; i++)
{
printf("%c\t", ptr[i]);
}
printf ("\n");
free(ptr);
printf("释放后:\n");
for (i = 0; i < 4; i++)
{
printf("%c\t", ptr[i]);
}
printf ("\n");
printf("address ptr: %p\n", ptr);
return 0;
}
验证如下:
address of ptr: 00000000
address of ptr's size(Byte): 4
address of ptr[0]: 007618B8
address of ptr[1]: 007618B9
address of ptr[2]: 007618BA
address of ptr[3]: 007618BB
A B C D
释放后:
v
address ptr: 007618B8
|
|