C语言指针理解 --- 代码配合图形讲解内存四区

简介: C语言指针理解 --- 代码配合图形讲解内存四区
1. #define _CRT_SECURE_NO_DEPRECATE
2. 
3. #include "stdlib.h"
4. #include "string.h"
5. #include "stdio.h"
6. 
7. 
8. //c++编译器优化
9. char *getStr1()
10. {
11.   char *p = "abcd1";    //这里定义的abcd1放在全局区
12.   return p;
13. }
14. 
15. char *getStr2()
16. {
17.   char *p = "abcd1";    //这里定义的abcd1也放在全局区,因为上面已经定义了abcd1,所以这里的abcd1不再重新分配内存
18.   return p;
19. }
20. 
21. char *getStr3()
22. {
23.   char buf[100];
24.   memset(buf, 0, sizeof(buf));
25.   strcpy(buf, "abcd1");
26.   return buf;
27. }
28. 
29. 
30. //在被调用函数里面malloc的内存,首地址传给调用函数有两种方法:
31. /*
32. 1、return      :下面的getStr就是实例
33. 2、指针做函数参数
34. */
35. char *getStr4()
36. {
37.   char *p = NULL; //p是分配在栈区的,但是p指向的内存空间的变量是分配在堆区的
38.   p = (char *)malloc(100);//在堆上分配100字节的空间
39. 
40.   strcpy(p, "abcdefg");   //这句话的理解
41.   //先在全局区的常量区分配一块内存,放置abcdefg,
42.   //然后将abcdefg拷贝到上一步堆上分配的空间中
43. 
44.   return p;
45. }
46. 
47. 
48. void main(void)
49. {
50.   int a = 0;
51.   char *p1 = NULL;
52.   char *p2 = NULL;
53.   char *p3 = NULL;
54.   p3 = (char *)malloc(100);
55.   p1 = getStr1();
56.   p2 = getStr2();
57. 
58.   printf("getStr2():%s....\n", getStr2());
59. 
60.   //这里调用getStr3输出的是乱码,是因为buf是分配在栈区的,
61.   //调用getStr3结束之后buf分配的空间就会被销毁,所以无法返回
62.   printf("getStr3():%s\n", getStr3());  
63. 
64.   //这里调用getStr4之后,是可以正确的返回的,
65.   printf("getStr4():%s\n", getStr4());
66. 
67.   printf("p1:%d....\n", p1);
68.   printf("p2:%d....\n", p2);
69.   system("pause");
70. }
71.

 

getStr4内存模型图

 

总结:

1. 内存四区分别为:代码区、全局区、堆区、栈区

  • 代码区的特点:共享和只读
  • 存放在全局区的有:全局变量、静态变量(包括全局静态变量和局部静态变量)、常量(字符串常量和const修饰的全局变量,const修饰的局部变量放在栈区)
  1.    全局区再细分一点分为bss段和data段,bss段存放的是未初始化的全局变量和未初始化的静态变量,已经初始化的全局变量和已经初始化的静态变量存放在data段。
  • 栈区:存放临时变量(包括语句块内的变量、函数参数等),由编译器管理开辟和释放
  • 堆区:malloc的变量,由程序员管理开辟和释放

2. 结合上面的code和画图示意的看,彻底搞懂内存四区模型。

相关文章
|
27天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
45 0
|
23天前
|
存储 JavaScript 前端开发
如何优化代码以避免闭包引起的内存泄露
本文介绍了闭包引起内存泄露的原因,并提供了几种优化代码的策略,帮助开发者有效避免内存泄露问题,提升应用性能。
|
26天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
15 2
|
27天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
27天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
1月前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
C语言
C语言指针(3)
C语言指针(3)
12 1
|
26天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
22 0