第41课 内存操作经典问题分析1

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第41课 内存操作经典问题分析1相关的知识,希望对你有一定的参考价值。

野指针:

技术分享图片

 

野指针的由来:

技术分享图片

 

示例程序:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 
 5 int main()
 6 {
 7     int* p1 = (int*)malloc(40);
 8     int* p2 = (int*)1234567;
 9     int i = 0;
10     
11     for(i=0; i<40; i++)
12     {
13         *(p1 + i) = 40 - i;
14     }
15 
16     free(p1); 
17     
18     for(i=0; i<40; i++)
19     {
20         p1[i] = p2[i];
21     }
22     
23     return 0;
24 }

第13行越界之后就相当于操作野指针了。第8行将随意一个地址转换为指针,也相当于野指针。

运行结果如下:

技术分享图片

 

基本原则:

技术分享图片

 

示例:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <malloc.h>
 4 
 5 struct Student
 6 {
 7     char* name;
 8     int number;
 9 };
10 
11 char* func()
12 {
13     char p[] = "D.T.Software";
14     
15     return p;
16 }
17 
18 void del(char* p)
19 {
20     printf("%s
", p);
21     
22     free(p);
23 }
24 
25 int main()
26 {
27     struct Student s;
28     char* p = func();
29     
30     strcpy(s.name, p); 
31     
32     s.number = 99;
33     
34     p = (char*)malloc(5);
35     
36     strcpy(p, "D.T.Software");
37     
38     del(p);
39     
40     return 0;
41 }

第15行返回局部字符数组,是不正确的。结构体s中的name没有初始化,s.name和p都是野指针。

34-36行的内存拷贝也会产生越界。和“任何与内存操作相关的函数必须指定长度信息”原则相违背。

运行结果如下:

技术分享图片

 

 

小结:

技术分享图片

 

以上是关于第41课 内存操作经典问题分析1的主要内容,如果未能解决你的问题,请参考以下文章

第42课 内存操作经典问题分析二

第42课 内存操作经典问题分析2

python 第22课 列表 内存分析 列表常用操作

python 第22课 列表 内存分析 列表常用操作

第55课 经典问题解析

python 第17课 字符串驻留机制 内存分析 字符串同一判断 值相等判断 成员操作符 字符串常用方法汇总