面经——C语言——指针大小,内存分配,野指针,大小端

文章目录

    • 指针大小
    • 分段
    • C语言内存分配
      • 1. 静态内存分配
        • 1.1 栈内存分配
        • 1.2 数据段内存分配
      • 2. 动态内存分配
        • 2.1 `malloc`(Memory Allocation)
        • 2.2 `free`(Free Memory)
      • 动态内存分配的流程
      • 例子
    • 野指针
      • 野指针的原因:
      • 防止野指针的做法:
    • 大小端
      • 如何检测当前机器的字节序?
        • 指针法
        • 联合体法

指针大小

在C++中,指针的大小是与编译器平台相关的,通常与操作系统和架构的位数有关。具体来说,指针的大小通常取决于计算机的字长(即操作系统和处理器的位数),常见的情况如下:
32位系统:指针大小通常为4字节(32位)。
64位系统:指针大小通常为8字节(64位)。

分段

内存区域描述特点
代码段存储程序的可执行指令(代码)。只读,防止程序修改自身指令;多个进程共享,节省内存空间。
数据段存储已初始化的全局变量和静态变量。可读写,程序启动时加载到内存,存储已初始化的全局和静态变量。
BSS段存储未初始化的全局变量和静态变量,启动时初始化为零。不存储数据,只分配空间;程序启动时操作系统将其初始化为零。
用于动态分配内存,程序员在运行时手动管理。动态分配和释放内存;大小可随程序需求变化;需使用mallocfree等函数。
存储函数的局部变量、参数和函数调用时的上下文信息。后进先出(LIFO);每次函数调用时分配栈帧,函数返回时弹出栈帧。

C语言内存分配

在C语言中,内存分配通常分为两种方式:静态内存分配动态内存分配。这两种方式的主要区别在于内存分配的时间和方式。

1. 静态内存分配

静态内存分配是指在程序编译时就已经确定了内存的大小和位置,通常在数据段中进行。

1.1 栈内存分配

栈内存分配用于存储函数的局部变量。栈内存分配是自动的,内存大小在编译时已确定。当函数调用时,局部变量会在栈上分配内存,函数返回时,栈上的内存会被自动释放。

void example() {int local_var = 10;  // local_var在栈上分配内存
}
1.2 数据段内存分配

数据段用于存储全局变量、静态变量和常量。数据段内存的大小和位置在程序编译时已确定,且内存通常在程序的生命周期内存在。

int global_var = 100;  // 全局变量,在数据段分配内存void example() {static int static_var = 200;  // 静态变量,在数据段分配内存
}

2. 动态内存分配

动态内存分配是指在程序运行时,根据需要动态地分配和释放内存。动态内存分配主要通过标准库中的malloccallocreallocfree函数来进行。

2.1 malloc(Memory Allocation)

malloc用于分配指定大小的内存块,返回一个指向该内存块的指针。该内存块的内容未初始化,可能包含随机数据。

int *ptr = (int *)malloc(sizeof(int) * 10);  // 分配10个整数的内存
if (ptr == NULL) {// 内存分配失败,处理错误
}
2.2 free(Free Memory)

free用于释放之前分配的动态内存。释放后,指针仍然存在,但它不再指向有效的内存块。因此,释放后应该将指针设置为NULL,以避免悬空指针的错误。

free(ptr);  // 释放之前分配的内存
ptr = NULL;  // 防止悬空指针

动态内存分配的流程

  1. 使用malloccalloc分配内存。
  2. 检查返回的指针是否为NULL,以确认内存是否分配成功。
  3. 使用动态分配的内存进行计算或存储数据。
  4. 使用完毕后,通过free释放内存,以避免内存泄漏。

例子

#include <stdio.h>
#include <stdlib.h>int main() {int *arr;int n = 5;// 动态分配内存arr = (int *)malloc(n * sizeof(int));if (arr == NULL) {printf("内存分配失败\n");return 1;}// 使用动态分配的内存for (int i = 0; i < n; i++) {arr[i] = i * 10;}// 打印内容for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");// 释放内存free(arr);arr = NULL;  // 防止悬空指针return 0;
}

野指针

野指针是指向一个已经释放或未初始化的内存区域的指针。

野指针的原因:

  1. 未初始化的指针:
    在使用指针之前没有给它分配有效的内存地址,指针的值是随机的,可能指向一个无效的位置。

    int *ptr;  // ptr未初始化
    *ptr = 10; // 错误,野指针
    
  2. 释放内存后继续使用指针:
    释放指针所指向的内存后,如果继续访问该内存,指针就变成了野指针。

    int *ptr = malloc(sizeof(int)); // 动态分配内存
    free(ptr);  // 释放内存
    *ptr = 10;  // 错误,ptr变为野指针
    
  3. 指针指向的内存已被回收:
    当一个局部变量的作用域结束时,其内存会被释放。如果指针指向该局部变量的地址,它就成为了野指针。

    int *ptr;
    {int x = 10;ptr = &x;  // ptr指向局部变量x
    }  // x的内存被回收
    *ptr = 20;  // 错误,ptr成为野指针
    

防止野指针的做法:

  1. 初始化指针:
    指针在声明时应该初始化,避免指向随机内存。

    int *ptr = NULL;  // 初始化为NULL
    
  2. 避免使用已释放的内存:
    在调用free释放内存后,应将指针设置为NULL,防止指针继续访问无效内存。

    free(ptr);
    ptr = NULL;  // 防止野指针
    
  3. 检查指针的有效性:
    在使用指针之前,检查其是否指向有效的内存地址,特别是动态分配内存时。

    if (ptr != NULL) {*ptr = 10;
    }
    

通过这些方法,可以有效地避免和处理野指针问题,提升程序的稳定性和安全性。

大小端

大端是指数据的高字节存储在低地址处,低字节存储在高地址处。即,数据的高位字节在前低位字节在后

小端是指数据的低字节存储在低地址处,高字节存储在高地址处。即,数据的低位字节在前高位字节在后

如何检测当前机器的字节序?

指针法

在C++中,可以通过以下方法检测当前机器是大端还是小端:

#include <iostream>int main() {int num = 1;char *ptr = (char *)&num;if (*ptr == 1) {std::cout << "小端\n";} else {std::cout << "大端\n";}return 0;
}
联合体法
#include <stdio.h>union EndianTest {int num;unsigned char byte;
};int main() {union EndianTest test;test.num = 0x12345678;  // 设置一个整数值// 查看bytes数组的第一个字节if (test.byte == 0x78) {printf("小端 (Little Endian)\n");} else if (test.byte== 0x12) {printf("大端 (Big Endian)\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68872.shtml

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

相关文章

CMake项目编译与开源项目目录结构

Cmake 使用简单方便&#xff0c;可以跨平台构建项目编译环境&#xff0c;尤其比直接写makefile简单&#xff0c;可以通过简单的Cmake生成负责的Makefile文件。 如果没有使用cmake进行编译&#xff0c;需要如下命令&#xff1a;&#xff08;以muduo库echo服务器为例&#xff09;…

书生大模型实战营7

文章目录 L1——基础岛提示词工程实践什么是Prompt(提示词)什么是提示工程提示设计框架CRISPECO-STAR LangGPT结构化提示词LangGPT结构编写技巧构建全局思维链保持上下文语义一致性有机结合其他 Prompt 技巧 常用的提示词模块 浦语提示词工程实践(LangGPT版)自动化生成LangGPT提…

Shadow DOM举例

这东西具有隔离效果&#xff0c;对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…

SQLAlchemy 2.0的简单使用教程

SQLAlchemy 2.0相比1.x进行了很大的更新&#xff0c;目前网上的教程不多&#xff0c;以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎&#xff0c;链接到mysql engine crea…

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

某网盘工具,限速下载上传!

聊一聊 某度盘对于个人和未开通会员的情况下&#xff0c;容量还是有点小。最近自己的盘满了&#xff0c;还有很多东西放不进去。转眼发现正在下载的寻雷&#xff0c;就点进去看看寻雷盘有多大&#xff0c;一看&#xff0c;还好&#xff0c;比某度盘容量大。 但一想&#xff0…

【后端开发】字节跳动青训营Cloudwego脚手架

Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令&#xff1a; GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装&#xff1a; go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…

LabVIEW纤维集合体微电流测试仪

LabVIEW开发纤维集合体微电流测试仪。该设备精确测量纤维材料在特定电压下的电流变化&#xff0c;以分析纤维的结构、老化及回潮率等属性&#xff0c;对于纤维材料的科学研究及质量控制具有重要意义。 ​ 项目背景 在纤维材料的研究与应用中&#xff0c;电学性能是评估其性能…

Python 深拷贝与浅拷贝:数据复制的奥秘及回溯算法中的应用

引言 在 Python 编程领域&#xff0c;数据复制是极为常见的操作。而深拷贝和浅拷贝这两个概念&#xff0c;如同紧密关联却又各具特色的双子星&#xff0c;在数据处理过程中扮演着重要角色。深入理解它们&#xff0c;不仅有助于编写出高效、准确的代码&#xff0c;还能避免许多…

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中&#xff0c;网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力&#xff0c;成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本&#xff0c;该脚本集成了 ARP 扫描、端口扫描以及 TCP…

GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI

同学们好&#xff01;今天和大家分享的是 “改进型土壤调整植被指数MSAVI”&#xff0c;它能够更准确地反映植被生长状态&#xff0c;且广泛应用于植被覆盖监测、生态环境评估等领域。 1. MSAVI 改进型土壤调整植被指数&#xff08;MSAVI&#xff09;是一种针对植被覆盖区域土…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

进阶数据结构——双向循环链表

目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版&#xff08;c&#xff09;八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表&#xff0c;双向循环链表是一种特殊的数据结构&…

稀疏混合专家架构语言模型(MoE)

注&#xff1a;本文为 “稀疏混合专家架构语言模型&#xff08;MoE&#xff09;” 相关文章合辑。 手把手教你&#xff0c;从零开始实现一个稀疏混合专家架构语言模型&#xff08;MoE&#xff09; 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…

PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复

问题 在 PVE 中给 Debian 虚拟机新分配硬盘后&#xff0c;通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后&#xff0c;怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识&#xff1a;挂载硬盘和开启Samba共享。 新建一个虚拟机&#xf…

Baklib如何改变内容管理平台的未来推动创新与效率提升

内容概要 在信息爆炸的时代&#xff0c;内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容&#xff0c;帮助用户有效地管理信息流。随着技术的发展&#xff0c;传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性&#xff0c;这促使市场需…

想品客老师的第天:类

类是一个优化js面向对象的工具 类的声明 //1、class User{}console.log(typeof User)//function//2、let Hdclass{}//其实跟1差不多class Stu{show(){}//注意这里不用加逗号&#xff0c;对象才加逗号get(){console.log(后盾人)}}let hdnew Stu()hd.get()//后盾人 类的原理 类…

Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;菜品管理 &#xff08;2&#xff09;公告管理 &#xff08;3&#xff09; 厨师管理 2、用…

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后&#xff0c;我们再来学习Maven高级。其实在前面的课程当中&#xff0c;我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习&#xff0c;相信大家对于 Maven 这款工具的基本使用应该没什…