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

news/2025/12/8 4:47:16/文章来源:https://www.cnblogs.com/dersu/p/19319341

我閱讀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.mzph.cn/news/992025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#贪心,高维前缀和,状压dp#CF1208F Bits And Pieces ARC100E - Or Plus Max

贪心,高维前缀和,状压dpARC100E - Or Plus Max 题目 对于每个 \(k\in (0,2^n)\),求 \(a_i+a_j(0\leq i<j\leq k)\) 的最大值。分析 可以发现 \(\max_{i\& k==i}a_i\) 可以通过高维前缀和实现,而另一个相当于…

深夜有感——关于论文构思idea的时候该如何进行细化

三个层次: 1)整体结构层面;2)论证逻辑层面;3)写作执行层面。虽然这整体是ai构思出来的,但是我个人认为,不管是ai还是人写出来,能用,能在后续给我们启发,就可以采纳、可以拿来使用,因为这个不同人一般不会问…

word技巧积累:解决“调节了单倍行距,行距依然很大”的问题

一、背景描述 如图所示,这个巨大的行距很恼人二、根本原因/原理(只想解决问题看 三) word开启了网格布局什么是 网格布局?文档网格是指在Word文档中设置的一种隐形的网格线,类似于方格纸的格子。它可以帮助用户在…

20232303 2025-2026-1 《网络与系统攻防技术》实验八实验报告

20232303 2025-2026-1 《网络与系统攻防技术》实验八实验报告 1. 实验内容 (1)Web前端HTML能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML(2)Web前端javascript理解JavaScri…

251208

251208主流价值观只有一个核心这就和先有鸡先有蛋一样,都是同一个问题,一个人觉得对,周围人都觉得他对,如果一个婴儿有一个奇怪的母亲,那他就是一个奇怪的婴儿 生物的趋同是必然,即便是最脱离社会的人也和常人有…

模法

Montgomery Multiplication洛谷上发过了。这里也发一下。因为滚去 whk 鸽了两年的 Montgomery 取模。 众所周知取模很慢,因为一般的除法很慢。但是除一个 \(2\) 的幂或者对它取模很快。考虑将对固定模数 \(p\) 的取模…

20232307 2025-2026-1 《网络与系统攻防技术》实验八实验报告

20232307 2025-2026-1 《网络与系统攻防技术》实验八实验报告 1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaS…

阅读笔记8

八、阅读笔记八:团队协作与沟通 —— 发挥集体力量的核心​ 《程序员修炼之道:从小工到专家》的第八部分围绕团队协作与沟通展开,系统阐述了如何通过高效的协作机制和顺畅的沟通渠道,发挥团队的集体力量,提升整体…

阅读笔记7

七、阅读笔记七:项目管理与流程 —— 确保开发有序推进的保障 《程序员修炼之道:从小工到专家》的第七部分聚焦于项目管理与开发流程,深入探讨了如何通过科学的管理方法和规范的流程设计,确保软件开发项目有序推进…

12.8

星期一,数据结构,建模,还有连数据库

足球有救了?清华大学机器人踢出一脚好球

人形机器人学踢球,揭示具身智能新路径!大语言模型通过对话交互完成图灵测试,标志着自然语言处理领域的智能水平达到重要里程碑,对于具身智能而言,在非结构化物理环境中实现类人化足球运动能力,堪称其运动智能的终…

OEM 5K0905861C ELV Emulator for 2014-2015 VW Sagitar/Lavida/Tiguan – Fix Steering Lock Issues

Resolving Volkswagen ELV Issues: The OEM 5K0905861C Emulator Solution The Pain Point: ELV Malfunctions in 2014-2015 VW Models For owners of 2014-2015 Volkswagen Sagitar, Lavida, or Tiguan, Electronic S…

Genuine OEM BMW CIC 10Pin Navigation Switch for 5/7 Series 2009-2014 (Three Boards)

Problem: Outdated or Malfunctioning Navigation Switches in BMW 5/7 Series (2009-2014) For BMW owners with 5 Series (E60/E61) or 7 Series (E65/E66) models from 2009 to 2014, a common frustration is unre…

[硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏

[硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏[硬核对比] 进程 vs 线程 vs Java线程:状态模型的“套娃”游戏 作者: YUNGUI 标签: #操作系统 #Java #多线程 #面试必问引言 在面试中,我们经常会被问…

科研人必藏!生物医学高分顶刊合集

高分生物与医学期刊,科研投稿不迷路!本期我们就聚焦生物与医学类领域,带大家解锁生物医学领域的专属投稿攻略~ 01.The Lancet 期刊介绍 《The Lancet(柳叶刀)》是医学领域国际顶尖综合性学术期刊,该刊为 SCIE 收…

JAVA学习随笔-DAY2

第一个Java程序点击查看代码 public class HelloWorld {/* 第一个Java程序* 它将输出字符串 Hello World*/public static void main(String[] args) {System.out.println("Hello World"); // 输出 Hello Wor…

YANHUA Toyota R7F701401 Unencrypted Interface Board (Module 35) for Mileage Correction

The 2025 YANHUA Toyota R7F701401: Your Trusted Solution for Precise Mileage Correction Problem: Navigating Mileage Adjustments with Confidence In automotive repair, accurate mileage tracking is non-neg…

Git安装详细版

Git安装详解 引言 掌握 Git,从一次完美的安装开始 在当今的软件开发世界,Git 已远不止是一个工具;它是代码的“时间机器”、团队协作的“通用语言”,更是连接全球开源生态的基石。无论你是初探编程奥秘的学生,还是…

Polaris.AI Programming Contest 2025(AtCoder Beginner Contest 429)

D - On AtCoder Conference 环形 二分 #include<bits/stdc++.h> using namespace std; #define endl \n #define yes cout << "Yes" << endl #define no cout << "No" &l…

折腾笔记[39]-使用Scala3的Storch计算

使用Scala3的Storch(对标PyTorch)简单计算张量.摘要 使用Scala3的Storch(对标PyTorch)简单计算张量. 前言 本文目的是分享人工踩坑经验, AI搜索引擎可以更快给出正确结果(用于投喂AI😂). 简介 bytedeco系列javacpp库…