【C语言常量存储深度解析】:揭秘const变量内存布局的5个关键细节

7. const分配内存情况 【代码】7. const分配内存情况。 阅读详情

第一章:C语言中const常量的存储位置概述

在C语言中,`const`关键字用于声明不可修改的变量,通常被称为“常量”。然而,尽管名为常量,其实际存储位置并非固定不变,而是由编译器根据使用场景和优化策略决定。理解`const`常量的内存布局,有助于深入掌握C语言的内存管理机制。

const变量的存储区域分析

`const`修饰的变量可能被存储在以下几种内存区域之一:
  • 只读数据段(.rodata):全局或静态作用域中的const变量通常被放置于此,该区域在程序运行期间不可修改。
  • 栈(stack):局部const变量(如函数内定义)通常分配在栈上,虽然逻辑上不可变,但物理上位于可执行栈空间。
  • 寄存器或直接优化掉:若const变量为编译时常量(如字面量替换),编译器可能将其直接嵌入指令中,不占用内存。

代码示例与存储行为

// 全局const变量:通常存于.rodata段
const int global_const = 100;

void func() {
    // 局部const变量:通常分配在栈上
    const int local_const = 200;
    
    // 数组形式的const字符串:字符内容在.rodata
    const char* str = "Hello, World!";
}
上述代码中,`global_const`和字符串字面量"Hello, World!"会被编译器放入只读数据段;而`local_const`虽不可修改,但仍作为栈变量存在。

存储位置判断方法

可通过查看编译后的汇编代码或使用objdump工具分析目标文件来确认存储位置。例如:
  1. 编译生成目标文件:gcc -c test.c -o test.o
  2. 查看只读段内容:objdump -s -j .rodata test.o
  3. 检查符号表:readelf -s test.o
变量类型示例典型存储位置
全局constconst int a = 5;.rodata
局部constconst int b = 10;栈
字符串字面量"const string".rodata

第二章:const变量在不同作用域下的内存分布

2.1 全局const变量的存储区域分析与验证

在C/C++中,全局`const`变量默认具有内部链接性,其存储位置通常位于只读数据段(`.rodata`),而非栈或堆。
存储区域验证示例
const int global_const = 42; // 定义全局const变量

int main() {
    printf("Address of global_const: %p\n", (void*)&global_const);
    return 0;
}
通过打印地址可发现,`global_const`位于程序的只读数据段。使用`objdump -t`或`readelf -S`可进一步确认其归属`.rodata`节。
编译器处理机制
  • 若`const`变量未取地址,编译器可能直接将其作为立即数优化,不分配存储空间;
  • 一旦取地址(如取指针),则必须分配内存,存放于`.rodata`段;
  • 跨文件共享时需使用`extern const int x;`声明,确保唯一实例。

2.2 局部const变量在栈区的布局机制探究

局部`const`变量在函数作用域内定义后,其存储位置位于栈区,但具备只读属性。编译器通常将其值直接嵌入指令或保留在栈帧的局部变量区。
内存布局示例
void func() {
    const int val = 42;  // 局部const变量
    int normal = val + 1;
}
该代码中,`val`被分配在当前栈帧的高地址区域,与普通局部变量相邻,但编译器禁止生成对其的写操作指令。
栈区布局特点
  • 生命周期随函数调用开始与结束
  • 地址由高向低增长,`const`变量与其他局部变量共享栈空间
  • 访问方式为基址指针(如`ebp`或`rsp`)偏移寻址
尽管`const`变量不可修改,其仍占用实际栈空间,除非被完全常量折叠优化。

2.3 const变量与段属性(.rodata)的关联实践

在C/C++中,`const`修饰的全局或静态变量默认存储于只读数据段(`.rodata`),而非栈或堆中。这一机制保障了内存安全并支持编译器优化。
内存布局示例

const int version = 100;
const char* name = "project_x";
上述代码中,`version` 的值 100 存储在 `.rodata` 段,`name` 指向的字符串字面量同样位于该段。通过 `objdump -s -j .rodata` 可验证其地址分布。
链接与优化影响
  • 多个翻译单元引用同一 `const` 变量时,避免重复定义冲突
  • 链接器可合并相同内容的只读数据,减少镜像体积
  • 运行时无法修改,硬件层面触发写保护异常

2.4 编译器优化对const存储位置的影响实验

在C/C++中,`const`变量的存储位置可能因编译器优化策略而异。通过实验可观察不同优化级别下`const`变量的内存布局变化。
实验代码设计
const int val = 42;                    // 定义常量
int main() {
    volatile int* ptr = (int*)&val;     // 防止优化绕过
    return *ptr;
}
该代码强制取`const`变量地址,防止其被完全内联或消除。使用`volatile`确保访问不会被优化掉。
优化级别对比
  • -O0:`val`通常分配在.data段
  • -O2:可能被移至.rodata段,甚至直接内联为立即数
结果分析
通过objdump -t查看符号表,发现高阶优化下`val`可能不占用显式存储空间,体现编译器对`const`语义的深度利用。

2.5 跨编译单元const变量的链接行为剖析

在C++中,`const`变量默认具有内部链接(internal linkage),这意味着即使在头文件中定义,也不会在多个编译单元间产生符号冲突。
链接属性的本质差异
普通全局变量默认为外部链接,而`const`全局变量则不同。例如:
// config.h
const int MAX_SIZE = 100;

// file1.cpp 和 file2.cpp 都包含 config.h
// 编译器为每个编译单元生成独立的MAX_SIZE副本
尽管各单元拥有独立副本,但由于值恒定且不取地址时可内联替换,实际不会引发多重定义错误。
显式控制链接性
若需跨单元共享同一`const`变量实例,应使用`extern`声明:
  • 在头文件中声明: extern const double PI;
  • 在单一源文件中定义: const double PI = 3.14159;
此时`PI`具备外部链接,所有引用指向唯一实例,避免数据冗余与同步问题。

第三章:const与存储类别的交互关系

3.1 const与static关键字组合的内存影响

在C++和Java等语言中,`const`与`static`关键字的组合对内存布局和生命周期有显著影响。当一个变量被声明为`static const`时,它成为类级别的常量,仅在程序启动时初始化一次,并存储于静态数据区。
内存分布特性
此类变量不随对象实例化而重复分配,节省内存并保证值的一致性。编译器通常将其优化为字面量替换或放入只读段(如.rodata)。
代码示例

class Config {
public:
    static const int MAX_RETRIES = 3;
};
上述代码中,`MAX_RETRIES`在编译期确定,不占用对象实例空间。链接时需确保该符号在静态区有唯一定义(某些旧标准要求在.cpp中定义)。
  • 存储位置:静态存储区(.data或.rodata)
  • 生命周期:程序运行期间持续存在
  • 访问方式:通过类名直接访问,无需实例

3.2 extern引用const全局变量的存储一致性

在C++中,`const`全局变量默认具有内部链接(internal linkage),这意味着即使在多个翻译单元中声明同名`const`变量,它们也被视为独立实体。当使用`extern`关键字显式声明其为外部链接时,可实现跨文件共享同一实例。
链接属性的影响
通过`extern`修饰,`const`变量的链接属性从内部转为外部,确保所有引用指向相同的内存地址,避免多份副本导致的数据不一致。

// file1.cpp
const int config_value = 42; // 需加extern才能被外部访问

// file2.cpp
extern const int config_value; // 正确引用file1中的定义
上述代码中,若`file1.cpp`的`config_value`未使用`extern`定义,则`file2.cpp`的引用将链接失败或产生ODR违规。
编译期与运行期行为
由于`const`变量常被优化至符号表,编译器可能直接内联其值,因此必须确保所有翻译单元可见的定义完全一致,防止因存储位置差异引发逻辑错误。

3.3 动态库中const常量的共享与隔离特性

在动态链接库中,`const` 常量的内存管理具有特殊性。通常情况下,编译器会将 `const` 全局变量放入只读数据段(`.rodata`),多个进程加载同一动态库时,该段内存可被共享,从而节省资源。
内存布局与共享机制
不同进程调用同一动态库时,其 `const` 变量位于共享的只读段,逻辑上“值相同且地址一致”,但受地址空间布局随机化(ASLR)影响,虚拟地址可能不同。
示例代码

// libshared.so
const int version = 100;
上述代码中的 `version` 被存储在 `.rodata` 段。可通过 readelf -S libshared.so 验证其段属性。
  • 多个进程映射同一物理页,实现高效共享
  • 修改 `const` 变量将触发段错误(SIGSEGV)
  • 非常量变量则各自独立,不共享

第四章:底层视角下的const存储机制验证

4.1 利用指针强制修改const变量的后果测试

在C/C++中,`const`关键字用于声明不可变变量,但通过指针仍可能绕过该限制。
代码示例与行为分析

#include <stdio.h>
int main() {
    const int val = 42;
    int *ptr = (int*)&val;  // 强制获取地址
    *ptr = 100;              // 尝试修改
    printf("val = %d\n", val);
    printf("*ptr = %d\n", *ptr);
    return 0;
}
上述代码通过取地址并强制类型转换,试图修改`const`变量。尽管编译器可能允许,但此操作引发**未定义行为(UB)**。
典型结果与风险
  • 某些编译器将`const`变量放入只读段,运行时修改会触发段错误
  • 若变量被优化为常量折叠,打印值仍为原始值(如42),即使指针修改成功
  • 跨平台行为不一致,严重降低代码可移植性

4.2 反汇编分析const变量的地址分配方式

在C++中,`const`变量是否分配内存取决于其使用场景。通过反汇编可深入理解编译器对`const`变量的优化策略。
基本示例与反汇编观察

const int val = 42;
int arr[val]; // 合法:val被视为编译时常量
上述代码中,`val`可能不分配实际内存,而是直接内联替换为立即数42。
取地址触发内存分配
当对`const`变量取地址时,编译器必须为其分配存储:

const int x = 100;
const int* p = &x; // 强制分配内存
反汇编显示此时生成`.rodata`节中的符号引用,表明静态存储已分配。
  • 局部const变量:可能优化为寄存器或立即数
  • 全局const变量:默认内部链接,存放于.rodata段
  • 取地址操作:强制内存分配以获取有效地址

4.3 不同编译器(GCC/Clang/MSVC)的实现差异

不同编译器在C++标准实现上存在细微但关键的差异,影响代码可移植性与性能优化策略。
标准符合性与扩展支持
GCC和Clang高度遵循C++标准,并提供丰富的编译选项。MSVC在较新版本中逐步增强标准兼容性,但仍保留如__declspec等专有扩展。
属性语法差异

[[nodiscard]] int compute(); // C++17通用语法
GCC与Clang全面支持属性语法;MSVC自VS2017起支持[[nodiscard]],但旧版本需使用_Check_return_等宏替代。
诊断信息输出对比
编译器错误提示清晰度模板实例化追踪
GCC详细但冗长支持
Clang结构清晰、颜色提示极佳
MSVC简洁,集成IDE友好有限

4.4 嵌入式平台中const常量的Flash存储应用

在嵌入式系统中,`const`修饰的常量默认被视为可写数据,若未明确指定存储位置,可能被加载至RAM,造成资源浪费。通过合理使用链接器指令与编译属性,可将常量强制定位至Flash存储器。
Flash存储的优势
  • 节省RAM空间,提升系统可用内存
  • 降低功耗,避免重复初始化
  • 提高数据安全性,防止运行时误修改
代码实现与分析
const uint8_t logo_data[] __attribute__((section(".rodata"))) = {
    0x00, 0x01, 0x02, 0x03, // 示例图像数据
    0x04, 0x05, 0x06, 0x07
};
上述代码通过__attribute__((section))将常量数组logo_data放置于.rodata段,该段在链接脚本中通常映射至Flash区域。编译后,数据直接固化在Flash中,运行时按需读取,无需复制到RAM。

第五章:总结与最佳实践建议

性能优化策略
在高并发系统中,数据库查询往往是性能瓶颈。使用缓存层如 Redis 可显著降低响应延迟。以下是一个 Go 语言中使用 Redis 缓存用户信息的示例:

// 获取用户信息,优先从 Redis 读取
func GetUser(id int) (*User, error) {
    key := fmt.Sprintf("user:%d", id)
    val, err := redisClient.Get(context.Background(), key).Result()
    if err == nil {
        var user User
        json.Unmarshal([]byte(val), &user)
        return &user, nil
    }
    // 缓存未命中,查数据库
    user := queryDB(id)
    jsonData, _ := json.Marshal(user)
    redisClient.Set(context.Background(), key, jsonData, 5*time.Minute) // 缓存5分钟
    return user, nil
}
安全配置规范
生产环境必须启用 HTTPS,并配置合理的安全头。以下是 Nginx 中推荐的安全头设置:
  • Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  • X-Content-Type-Options: nosniff
  • X-Frame-Options: DENY
  • Content-Security-Policy: default-src 'self'
监控与告警机制
建立完善的监控体系是保障系统稳定的关键。Prometheus + Grafana 组合广泛用于指标采集与可视化。下表列出关键监控指标及其阈值建议:
指标正常范围告警阈值
CPU 使用率< 70%> 90% 持续5分钟
HTTP 5xx 错误率0> 1% 持续2分钟
数据库连接池使用率< 80%> 95%
Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本) 本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。 阅读详情

相关推荐

SAP物料分类账实战:从配置到月结的关键步骤(基于S/4HANA1909)

本文详细解析了在SAP S/4HANA 1909系统中,物料分类账从基础配置到月结操作的全流程。作为成本核算的核心,物料分类账通过多级价格确定实现实际成本核算,关键步骤包括激活物料分类账、配置自动过账科目(OBYC)、运行CKMLCP进行差异分摊与结算。文章旨在帮助财务与成本会计人员确保成本差异的准确归集与分摊,顺利完成月结。

weixin_28314575的博客 196

const 变量的存储位置

const 变量的存储位置 在C语言和C++中const 全局变量都是存储在只读数据区(.rodata),但是是有条件的,在编译期最初都是将其存储在符号表中。 (1)C语言的const全局变量只有在第一次被使用时才会在只读数据区分配内存空间存储。 (2)C++中的const全局变量是否分配内存空间存储取决于它的用途,如果是充当一个值替换(将一个变量名替换为一个值),那么它是不分配内存空间的。当对这个const全局变量取地址或者使用extern时,就会分配内存空间存储。 空间的释放的时机遵循只读数据段内存释放

zl_1719828096的博客 6178

MTK平台TP驱动设备树与GPIO配置实战解析

本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。

ice55的博客 235

【C语言】【const】不同情况下,const修饰的变量存储的位置

全局const变量存储在静态存储区,可以在程序的任何地方访问。局部const变量存储在栈上,在函数调用时分配,在函数返回时释放。const修饰的字符串常量STR_CONST存储在常量存储区,在程序运行期间保持不变。总之,const修饰的变量可以存储在静态存储区、栈或常量存储区,具体取决于变量的声明位置和用途。

m0_56844552的博客 5028

别再只会用串口助手了!手把手教你用手机App调试HC-05蓝牙模块(STM32F103实战)

本文详细介绍了如何利用手机App调试HC-05蓝牙模块与STM32F103的无线连接,突破传统串口助手的限制。通过实战指南,开发者可以掌握移动性测试、实时监控和快速验证等高效调试技巧,优化蓝牙透传的稳定性和性能。

weixin_33670786的博客 428

双翌视觉系统配合机械手大视野定位案例(单目标带角度抓取)

一、定位原理概述 1.系统构架 视觉定位系统采用正向打光方式,光源在机械手上方,CCD从上往下拍摄,进行图像分析定位。相机将计算出的像素坐标转换为机械手的物理坐标,视觉软件与机械手进行网口通讯,将视野内物料的物理坐标发送给机械手,机械手抓取物料放在指定工位。 2.相机标定概述 系统采用宫格标定确定像素坐标和物理坐标一一对应关系,同时利用3点或者多点旋转标定求出旋转中心 系统采用宫格标定,自定义行列数和间距及旋转角度,通过机械手发送的当...

weixin_51554164的博客 2172

常量的存储

c语言中const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。 而const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。 在c语言中可以通过指针对const局部变量进行修改,而不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段 而c++中,一个const不是必需创建内存空间,而在c中,一个const总是需要一块内存空间。 在c++中是否要为const全局变量分配内存空间,取决于这个c

Tianqinse的博客 902

Mac上MySQL出现secure-file-priv为null

在使用MySQL导入导出文件时出现了错误,原因是没有配置secure-file-priv。 我的MySQL版本是8.0.13,使用如下命令查看secure-file-priv。 结果发现secure-file-priv为空,此时需要为它配置一个文件夹。 解决方案: 1)到MySQL的安装目录中去,Mac中是的是 /usr/local/mysql/support-files,该目录下有一...

zhangvalue的博客 5884

C和C++中const变量内存分配问题详解

一、const变量的内存分配 1.const全局变量,或者static,extern 关键字 此时该常量是存放在.rodata段的—Read Only Data也就是常量区,是无法通过取地址方式去修改的,修改内容会报段错误(gcc++编译器:Segmentation fault(core dumped))。   例如extern const int i=10,   static const int i=10。 2.const局部变量 在C语言中,const局部变量在栈分配内存,不能通过赋值,自

u014157109的博客 8015

NVIDIA vGPU三种授权方式(个人玩家版)

NVIDIA vGPU三种方式搭建授权服务器(个人玩家版)

wstc2689784536的博客 8439

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定

本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。

sunny的博客 282

【C/C++】 const

C和C++中const的异同

Alex_cf的博客 831

发那科 Fanuc PLC 报文通讯,报文解析。附源程序

发那科 Fanuc PLC 报文通讯,最详细的发那科 PLC报文解析,不再局限在官方提供的库,也不用再局限在windows平台。

ITOfDragon的博客 1748

珊瑚修复/潜水日志/礁区监测基于HarmonyOS ArkTS API 24通过findViewById等方法获取视图后逐一设置属性,这种方式在面对复杂界面和频繁状态变化时产生性能瓶颈和状态不一致问题

健身管理类应用与之前分析的外卖、招聘等应用有本质差异——它的核心数据不是"交易"或"任务",而是"时间序列的身体状态数据":每次训练有时长、卡路里、组数、重量;每次饮食有热量、蛋白质、碳水、脂肪;每周有运动时长趋势图。这些数据的共同特征是"随时间积累,用户需要横向对比和趋势分析"。这导致健身App的数据层设计必须从第一天就考虑"历史数据查询"和"多维度聚合"的需求,而非仅关注当前单条记录的增删改查。健身应用的用户行为模式也有独特之处:用户使用健身App的目标是"坚持",而不是"一次性完成任务"。这意味着激励

jin421352的博客 215

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于各类使用 const 修饰的变量存储区域分析

一文了解关于各类使用 const 修饰的变量所存储的区域

qq_42367781的博客 1016

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

const存储在哪个区_C++之Static与Const

static静态成员Static意为静态成员,若Static修饰的成员位于C++类中,那么Static就实现了同一个类,多个对象共享数据,协调行为的目的。静态变量具有全局变量的优势,又不会像全变量一样被滥用。C++中用于管理静态变量,就需要用到静态函数。C++中类的静态成员,属于类,也属于对象,但终归属于类。(比较绕,直接记做属于类)特点 共享 : static 成员变量实现了同族类对象间信息共享...

weixin_32518073的博客 2102

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【C++】C 语言 和 C++ 语言中 const 关键字分析 ② ( const 常量分配内存时机 | const 常量在编译阶段分配内存 )

一、const 常量内存分配时机 二、使用如下代码验证 const 常量内存分配时机 三、分析验证结果 - const 常量在编译阶段分配内存

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1349

【知识盲区】const修饰的变量的存储位置

c语言中const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。 而const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。 在c语言中可以通过指针对const局部变量进行修改,而不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段 而c++中,一个const不是必需创建内存空间,而在c中,一个const总是需要一块内存空间。 在c++中是否要为const全局变量分配内存空间,取决

ddiioopp123的博客 1903

C语言const常量存储位置全揭秘:掌握这3种情况,避免踩坑无数

掌握C语言中const常量的存储位置,避免程序异常与内存错误。详解编译器优化、全局与局部const变量的存储差异,涵盖RODATA段、栈和寄存器三种场景,提升代码稳定性与效率,值得收藏。

FuncWander的博客 821

const内存分配情况

常量结构体间接修改值。

weixin_74808846的博客 406

C++学习Day01之const分配内存情况

C++学习之const分配内存情况

似霰的博客 531

const类型变量的内存分配

<br />如果是局部自动变量 加了 const 只是起了个标记的作用,变量还是分配在栈区 <br />如果是全局变量,就会分配在只读数据段,也就是常量区 <br />程序验证如下: <br />  <br />#include  <iostream> <br />using namespace std; <br /><br />const int g_c = 0;          //如果是global变量的话确实是分配在常量区  <br />int g_a; <br />int main() <br

yyhtsm的专栏 1842

const、static型数据在内存中如何存储?(变量存放位置)

const、static型数据在内存中如何存储?(变量存放位置) static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量 const int val_c = 3 ; // const 全局变量 static int val_d ; // 未初始化的静态变量 int val_e ;......

魏波 1万+

const内存分配

常量有没有存储空间,或者只是编译时的符号而已? 不一定。 在C中,define常量是预处理阶段的工作,其不占据内存。但是const常量总是占据内存 在C++中,const常量是否占据存储空间取决于是否有引用该常量地址的代码。C++对于const默认为内部链接,因此const常量定义通常都放在头文件中,即使分配内存也不会出现链接错误。 若不引用常量对应的地址,则不会为其分配空间。 Co...

wangxiaohigh 358

C++中const分配内存情况分析

//1、局部变量const int a = 10 ;  int * p = &a //分配临时内存  指针不可修改     const int a = 10 ; 这句话表示const int a是存放在符号表中的常量,a是键,10是值。 平时是不分配空间的。int * p = &a,这句话的时候,系统会临时在栈区分配一个临时空间temp,temp空间的值是10.之后将临时空间的地址赋值给指针p

d137578736的博客 2463

C语言中const常量究竟存在哪?99%程序员都误解的存储机制曝光

揭秘C语言中const常量的存储位置,澄清常见误解。深入解析const变量在不同场景下的存储机制,涵盖全局与局部常量的内存分布规律,帮助程序员准确理解只读数据段与栈区的差异。掌握本质,避免错误使用,值得收藏。

InitPulse的博客 796
上一篇: 图的邻接表实现避坑指南:90%初学者忽略的3个核心细节
下一篇: 为什么你的爬虫效率低下?,可能是没用好requests.Session()
InitFlow
博客等级 码龄1年 145粉丝 2166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值