当前位置: 首页 > news >正文

【C編程】指針類型和內存分配

我閱讀kilo editor代碼。[1]

假如要將其按Power of 10修改代碼,如何省略內存分配的函數?

為什麼要用指針類型?

  1. 為了調用函數,修改數值。

例如:

#include <stdio.h>void swap1(int* a, int* b){
int temp;temp=*a;
*a=*b;
*b=temp;
}void swap2(int a, int b){
int temp;temp=a;
a=b;
b=temp;
}int main(){int x=10,y=20;printf("Before, x = %d,y = %d\n", x, y);swap1(&x, &y);printf("swap1, x = %d,y = %d\n", x, y);swap1(&x, &y);printf("swap1 again, x = %d,y = %d\n", x, y);swap2(x, y);printf("swap2, x = %d,y = %d\n", x, y);return 0;
}

使用函數是必要的,否則,這段程序直接寫代碼就有大量重複代碼。函數是模塊化思維。
但使用函數的返回值傳遞數值,只有一個數據。如果要函數修改更多的數據,需要用指針。

  1. 為了使用struct,struct是一種對象化思考,即一個對象有哪些屬性。

  2. 為了鏈接表link 數據類型。下一個指針指向同一個struct。

指針必須有地址,才能賦值。如何讓一個指針有地址?兩個方法:a)指向一個已經有地址的變量,但指針比較多餘。b)特地分配內存地址。但如果忘了free(p),引起內存泄露,程序運行時間一長,機器的內存就被泄露光了,即內存不在操作系統管理範圍內了,荒置了,沒有內存可用了。機器就宕機了。

我列舉一個例子說明指針如何賦值。至於鏈接表,需在數據結構中介紹。

#include <stdio.h>
#include <stdlib.h>/*realloc,malloc,free,exit,atexit*/int main(){int x;int* z;int* t;//不能寫在一起:int* z,t;printf("z is %p. t is %p.\n", z, t);z=&x;*z=5;printf("z is %p, *z=%d, x=%d\n", z,*z,x);//*t=7;//編譯通過,運行報錯:Segmentation fault: 11,程序至此崩潰,後面的代碼不再運行。
/*t這個內存地址,*t表示該地址的內存存儲的數據。*t可直接賦值的前提是t這個指針不是0(NULL)。*///printf("t is %p, *t=%d\n", t,*t);t=malloc(1);*t=9;printf("memory allocated, t is %p, *t=%d\n", t,*t);free(t);return 0;
}

如果確保內存不泄露,是不是沒事就積極地free(p)就好?
不可以。

#include <stdio.h>
#include <stdlib.h>/*realloc,malloc,free,exit,atexit*/int main(){int* t;//t=malloc(1);//Xcode報錯,但cc編譯通過。t=(int*)malloc(1);*t=9;printf("memory allocated, t is %p, *t=%d\n", t,*t);free(t);free(t);//cc沒有報錯,但後面的代碼不再執行。我過去釋放內存兩次的話,操作系統報錯。可見重複釋放內存,操作系統的行為是不定的。
/*Xcode: pointer being freed was not allocated
cpp_learning(25599,0x1000a95c0) malloc: *** set a breakpoint in malloc_error_break to debug*/printf("free(t) twice");return 0;
}

這就是為什麼C內存管理很難。分配給指針內存,之後不釋放不行,重複釋放也不行。但大型程序,例如editor,一個指針這裏用、那裏用,就容易內存管理不當。



參考:


  1. antirez, "Writing an editor in less than 1000 lines of code, just for fun", https://antirez.com/news/108 ↩︎

http://www.jsqmd.com/news/65875/

相关文章:

  • #贪心,高维前缀和,状压dp#CF1208F Bits And Pieces ARC100E - Or Plus Max
  • 深夜有感——关于论文构思idea的时候该如何进行细化
  • word技巧积累:解决“调节了单倍行距,行距依然很大”的问题
  • 20232303 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 251208
  • 模法
  • 20232307 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 阅读笔记8
  • 阅读笔记7
  • 12.8
  • 足球有救了?清华大学机器人踢出一脚好球
  • OEM 5K0905861C ELV Emulator for 2014-2015 VW Sagitar/Lavida/Tiguan – Fix Steering Lock Issues
  • Genuine OEM BMW CIC 10Pin Navigation Switch for 5/7 Series 2009-2014 (Three Boards)
  • [硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏
  • 科研人必藏!生物医学高分顶刊合集
  • JAVA学习随笔-DAY2
  • YANHUA Toyota R7F701401 Unencrypted Interface Board (Module 35) for Mileage Correction
  • Git安装详细版
  • Polaris.AI Programming Contest 2025(AtCoder Beginner Contest 429)
  • 折腾笔记[39]-使用Scala3的Storch计算
  • day03 指针应用和文件操作
  • ZenMux 企业级大模型聚合平台,免费试用模型 Gemini 3 Pro
  • 102302139 尚子骐 数据采集与融合作业4
  • 代码随想录32_动态规划基础
  • vsc_backgroud_css小记
  • 3、缺陷管理
  • SGLang 的 DP Attention 模式浅析 - -银光
  • 每日反思(2025年12月7号)
  • 记我第一次代码审计 (bluecmsv1.6的sql注入复现)
  • 每日3题 2(暂鸽)