1 #include<stdio.h>
2
3 #include<string.h>
4
5
6 int main()
7 {
8
9 char *str=(char*)malloc(50);
10 strcpy(str, "hello");
11
12
13 //str+=6;
14 char *p=str-6;
15 //free(p);
16 free(str);
17
18 printf("\nsizeof(str)=%d\n", sizeof(str));
19
20
21
22 if(str!=NULL)
23 {
24 strcpy(str+6, "worldfdasfasdfasfdasi");
25
26 printf("\n");
27 printf(str);
28 // printf(str+6);
29
30 printf("%s", str+6);
31 printf("\n");
32 }
33
}
问题1: free()释放的原理是什么, 因为即使内存释放后, 也是有可能能对对其进行操作赋值访问操作的,
所以怎么证明内存已经被释放了?
问题2: char *p = (char*)malloc(100);
p+=6;
char *q=p-6;
free(q);
(1)会发生什么?
(2)访问已经释放过的代码会发生什么?
(3free()释放内存分配到某一部分会怎样?
问题3: 尝试反汇编malloc()分配的汇编代码
问题4:
其他问题:
malloc 有两种访问方法, 一种是指针法, 一种是下标法
案例: pi = malloc( 25 * sizeof(int) );
int *pi2, i;
...
pi2=pi;
for(i=0; i < 25; i++) //第一种访问方法
*pi2++ = 0;
int i;
...
for( i=0; i < 25; i++) //第二种访问方法
pi[i] = 0;
常见的动态内存错误:
对NULL指针进行解引用,
对分配的内存进行操作时越过边界
释放并非动态分配的内存
试图释放一块动态分配的内存的一部分,
例如: pi = malloc( 10 * sizeof(int) );
free(pi);
一块动态内存被释放后被继续使用
......未完待续...