准备搞两个程序试试。
int* a = (int *)malloc(4*sizeof(int));
*(a+1) = 111;
printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
getchar();
a[1]'s address = 0x56106ca992a4,and a[1] is 111
另1个:
#include <stdio.h>
int main(int argc, char *argv[])
{
int *p =(int *)0x56106ca992a4;
printf("%d\n",*p);
return 0;
}
Segmentation fault (core dumped)
int *p = NULL;
printf("%d\n",*(p+0x56106ca992a4));
发现稍微换了一下代码也不行。emmm,我想直接查看OS的内存地址。直接找到0x56106ca992a4~0x56106ca992a8的每1个字节,然后组成32位的int值。
直接:linux check memory address value
查看发现,是用客户端实现这一功能的,唯一的应该是gdb。担不是gdb a.out什么的,而是要搭配管道以及进程号才可以。太麻烦了,不去试了。
所以,这段程序进入os后得到的内存的值可能是虚拟的地址,可能是其他的,反正是经过变换的,而且其他进程是无法访问的。(共享内存。。。)
如果malloc就相当于申请了一块大小的内存。
返回这个地址的首地址给1个指针。如果它在程序中一直没有使用,那么就会导致内存的白白占用。此时不是内存泄漏。
而如果它在程序中没有被free就被指向另一块地址了,那么就会导致这块地址在这个进程中永远无法被找到。
这样就会导致内存泄漏。也就是无用的内存越来越大,操作系统得一直给这个进程分配内存,导致最终内存的无法给予。
但是我又不想这么放弃,如果在一个程序中呢?
int* a = (int *)malloc(4*sizeof(int));
*a = 11;//elem1
*(a+1) = 111;// elem2
*(a+2) = 222;// elem2
*(a+3) = 333;// elem2
printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
free(a);
while(1)
{
int *temp = NULL;
printf("Please input your pointer:\n");
scanf("%p",&temp);
printf("the value of this address:%p is :[%d]\n",temp,*temp);
}
输出:
a[1]'s address = 0x55b4b2fa82a4,and a[1] is 111
Please input your pointer:
推测:
0x55b4b2fa82a0 – &a[0]
0x55b4b2fa82a4 – &a[1]
0x55b4b2fa82a8 – &a[2]
0x55b4b2fa82ac – &a[3]
a[1]
a[2]
a[3]
a[0]
再连续做一遍:
这个是free之后的,可以看到free了以后内存上面就已经面目全非了。
然后再变成一个指向其他内存,而不free的。
int* a = (int *)malloc(4*sizeof(int));
*a = 11;//elem1
*(a+1) = 111;// elem2
*(a+2) = 222;// elem2
*(a+3) = 333;// elem2
a = (int *)malloc(4*sizeof(int));
printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
while(1)
{
int *temp = NULL;
printf("Please input your pointer:\n");
scanf("%p",&temp);
printf("the value of this address:%p is :[%d]\n",temp,*temp);
}
可以看到这块内存全部都是0.
而没指向另一块地址以前是这样的:
我们现在来点题,看能不能用。当然就只测试a[1]了。
int* a = (int *)malloc(4*sizeof(int));
*a = 11;//elem1
*(a+1) = 111;// elem2
*(a+2) = 222;// elem2
*(a+3) = 333;// elem2
a = (int *)malloc(4*sizeof(int));
printf("a[1]'s address = %p,and a[1] is %d\n",(a+1),*(a+1));
int *temp = NULL;
printf("Please input your pointer:\n");
scanf("%p",&temp);
*temp = 999;
printf(" (temp->) modify:%d\n",*temp);
printf(" (a->) :%d\n",*a);
没报错,答案是肯定可以使用,但注意不要丢失地址。