C语言全局变量初始化顺序:为什么你的变量总是“未初始化”?

PLS-PM with R 偏最小二乘路径建模 (R语言) 1. 引入 1.1. 安装plspm包 plspm 是一个用于执行偏最小二乘路径建模分析的 r 程序包。 在 CRAN 上可以免费下载: Http://cran.r-project.org/web/packages/plspm/index.html. 此后,通过以下代码在r中安装并加载该程序包即可。 install.packages("plspm") library("plspm") 2. 一些简单概念 2.1. 潜变量和观测变量 不少变量如满意度、成功指数是无法通过观测得到 阅读详情

第一章:C语言全局变量初始化顺序的核心问题

在C语言中,全局变量的初始化顺序是一个常被忽视却极易引发运行时错误的关键问题。根据C标准,同一编译单元内的全局变量按照其定义顺序进行初始化,然而跨编译单元之间的初始化顺序是未定义的。这意味着,当一个全局变量的初始化依赖于另一个位于不同源文件中的全局变量时,程序行为可能因链接顺序或编译器实现而异。

跨文件初始化依赖的风险

考虑两个源文件中定义的全局变量存在依赖关系的情况:
// file1.c
int x = 5;

// file2.c
extern int x;
int y = x * 2;  // 依赖x的值,但初始化顺序不确定
上述代码中,若y在x之前初始化,则y将获得未定义值(通常为0),导致逻辑错误。这种问题在大型项目中尤为隐蔽,难以调试。

避免初始化顺序陷阱的策略

  • 尽量避免全局变量之间的跨文件依赖
  • 使用函数内静态变量配合访问函数(俗称“构造函数”模式)延迟初始化
  • 通过显式初始化函数统一管理全局状态,而非依赖隐式初始化顺序
例如,重构上述代码以确保安全访问:
int* get_x() {
    static int x = 5;
    return &x;
}

int* get_y() {
    static int y = *get_x() * 2;  // 确保x已初始化
    return &y;
}
该方法利用函数调用时机控制初始化顺序,规避了跨翻译单元的不确定性。

典型场景对比表

场景是否安全说明
同文件内顺序初始化是C标准保证定义顺序即初始化顺序
跨文件全局变量依赖否初始化顺序未定义,存在风险
静态局部变量延迟初始化是首次调用时初始化,顺序可控

第二章:全局变量初始化的基础机制

2.1 全局变量的存储类别与生命周期解析

全局变量在程序编译时被分配静态存储区,其生命周期贯穿整个程序运行周期,从程序启动时创建,到程序终止时销毁。
存储类别与作用域
全局变量默认具有外部链接(extern),可在多个源文件中共享。若使用 static 修饰,则限制为文件作用域。
初始化行为
未显式初始化的全局变量会被自动初始化为零值,包括基本类型和指针。

int global_var;        // 隐式初始化为 0
static int file_var = 42;  // 文件作用域,显式初始化
上述代码中,global_var 存储于全局数据段,生命周期覆盖整个程序运行期;file_var 被限制在当前文件内访问。
  • 存储位置:静态存储区
  • 生命周期:程序运行期间持续存在
  • 初始化:未初始化时默认为零

2.2 零初始化与常量表达式初始化的区别

在C++中,零初始化和常量表达式初始化在语义和执行时机上存在本质差异。
零初始化(Zero Initialization)
零初始化发生在程序启动时的静态初始化阶段,将对象设置为全零状态。适用于全局、静态变量或未显式初始化的聚合类型。
常量表达式初始化(Constant Expression Initialization)
该初始化要求初始值是编译期常量,并在编译阶段完成赋值。它属于静态初始化的一部分,优先于动态初始化执行。

int x;                    // 零初始化:x = 0
constexpr int y = 5;      // 常量表达式初始化:y = 5(编译期确定)
上述代码中,x 被零初始化,而 y 在编译期完成初始化,体现性能与语义上的优化。
  • 零初始化不依赖值的计算,仅清零内存
  • 常量表达式初始化可提升运行时效率

2.3 编译时初始化与运行时初始化的实现路径

在程序初始化过程中,编译时初始化和运行时初始化代表了两种不同的执行阶段策略。编译时初始化依赖于常量表达式,在链接前完成赋值,适用于全局变量或常量定义。
编译时初始化示例
const MaxSize = 100
var Buffer = [MaxSize]byte{}
该代码中,MaxSize 是编译期常量,数组长度在编译时确定,Buffer 的内存布局也随之固定,无需运行时干预。
运行时初始化流程
相比之下,运行时初始化通过 init() 函数实现:
func init() {
    log.Println("模块初始化")
}
每个包可定义多个 init 函数,按源文件字典序执行,用于建立数据库连接、注册驱动等依赖性操作。
  • 编译时初始化提升性能,减少启动开销
  • 运行时初始化支持复杂逻辑,具备完整语言特性支持

2.4 多文件项目中全局变量的链接行为分析

在多文件C/C++项目中,全局变量的链接行为由其存储类说明符决定。`extern`关键字用于声明变量在其他翻译单元中定义,实现跨文件共享。
链接属性分类
  • 外部链接:使用extern声明,可在多个文件中访问
  • 内部链接:使用static修饰,作用域限制在本文件
  • 无链接:局部变量,不参与链接过程
// file1.c
int global_var = 42;        // 定义并初始化

// file2.c
extern int global_var;       // 声明,引用file1中的定义
void print_val() {
    printf("%d\n", global_var);
}
上述代码中,global_var具有外部链接属性,链接器将符号解析到同一地址。
常见链接错误
重复定义或未定义引用会导致链接失败,需确保变量仅定义一次,其余均为extern声明。

2.5 实践:通过汇编观察初始化段的分布

在程序启动过程中,不同初始化代码被链接器分配到特定的内存段中。通过反汇编可清晰观察其布局。
查看初始化段的汇编布局
使用 objdump 反汇编可执行文件,重点关注 .init 和 .init_array 段:

Disassembly of section .init:
0000000000401000 <_init>:
    401000: 48 83 ec 08     sub    $0x8,%rsp
    401004: e8 17 00 00 00  callq  401020 <call_gmon_start>
上述指令表明,.init 段包含运行时初始化代码,由链接器自动组织,在 main 之前执行。
构造测试程序验证段分布
定义多个构造函数观察调用顺序:
__attribute__((constructor(1))) void init_first() {
    puts("First");
}
__attribute__((constructor(2))) void init_second() {
    puts("Second");
}
编译后通过 readelf -S 查看 .init_array 表项,确认函数指针按优先级排列。

第三章:跨翻译单元的初始化顺序陷阱

3.1 不同源文件间全局变量初始化的不确定性

在多文件C/C++项目中,不同源文件间的全局变量初始化顺序是未定义的,这可能导致程序行为异常。
问题根源
C++标准仅规定同一编译单元内全局变量按声明顺序初始化,跨文件顺序由链接顺序决定,不可控。
  • 文件A中的全局变量依赖文件B中的全局变量
  • 若B未初始化而A已使用,则引发未定义行为
代码示例
// file1.cpp
int getValue();

int x = getValue(); // 依赖file2中的y

// file2.cpp
int y = 10;

int getValue() {
    return y;
}
上述代码中,x的初始化依赖getValue()返回y的值。若file1.cpp中的x先于file2.cpp中的y初始化,则getValue()将返回0(未初始化的静态变量值),导致逻辑错误。

3.2 C标准对跨文件初始化顺序的规定与限制

在C语言中,全局变量和静态变量的初始化顺序在跨翻译单元时是未定义的。这意味着不同源文件之间的初始化顺序无法由程序员直接控制。
初始化顺序的不确定性
C标准仅规定:同一文件内的对象按声明顺序初始化,但跨文件顺序由编译器决定。这可能导致依赖其他文件全局变量初始化值的代码产生未定义行为。
常见问题示例

// file1.c
int x = 5;

// file2.c
extern int x;
int y = x * 2; // 危险:x 是否已初始化?
上述代码中,y 的初始化依赖于 x,但若 file2.c 中的变量先于 file1.c 初始化,则 y 将使用未定义的 x 值。
规避策略
  • 避免跨文件依赖全局变量进行初始化
  • 使用函数内静态变量延迟初始化(Meyer's Singleton)
  • 通过显式初始化函数统一调度

3.3 实践:构造依赖关系导致的“未初始化”案例

在复杂系统中,组件间的依赖关系若未正确初始化,极易引发运行时异常。典型场景是对象A依赖对象B,但B尚未完成初始化时A已开始执行。
代码示例:循环依赖引发未初始化

type ServiceA struct {
    B *ServiceB
}

type ServiceB struct {
    A *ServiceA
}

func NewServiceA() *ServiceA {
    a := &ServiceA{}
    a.B = NewServiceB(a) // A创建时传入自身引用
    return a
}

func NewServiceB(a *ServiceA) *ServiceB {
    return &ServiceB{A: a} // 此时a可能未完全初始化
}
上述代码中,NewServiceA 在构造过程中传递未完成初始化的 a 实例给 NewServiceB,可能导致 ServiceB 在使用 A 时访问到不完整状态。
常见规避策略
  • 延迟初始化:通过接口或工厂模式延迟依赖注入时机
  • 使用初始化屏障:确保所有依赖对象就绪后再启用主逻辑
  • 依赖反转:引入中间协调者管理生命周期

第四章:解决初始化顺序问题的设计策略

4.1 使用局部静态变量实现延迟初始化

在C++中,局部静态变量可用于实现线程安全的延迟初始化。其核心优势在于:首次控制流经过声明时初始化,且仅初始化一次。
基本语法与行为
std::string& get_instance() {
    static std::string instance = expensive_init();
    return instance;
}
上述代码中,instance 在第一次调用 get_instance() 时构造,后续调用直接返回已初始化实例。编译器自动生成同步逻辑,确保多线程环境下初始化的唯一性。
优点与适用场景
  • 无需显式加锁,降低并发编程复杂度
  • 避免全局构造顺序问题(Static Initialization Order Fiasco)
  • 适用于单例模式、日志器、配置管理等场景

4.2 函数调用替代直接变量依赖的重构方法

在复杂系统中,模块间直接依赖全局或静态变量易导致耦合度升高。通过引入函数调用获取依赖值,可实现逻辑解耦与行为可控。
优势分析
  • 提升封装性:隐藏数据获取细节
  • 增强可测试性:便于注入模拟逻辑
  • 支持动态计算:返回值可基于上下文变化
重构示例
var configValue = "original"

// 重构前:直接依赖
func processOld() string {
    return configValue
}

// 重构后:通过函数调用
func getConfig() string {
    return configValue // 可扩展为远程配置读取
}

func processNew() string {
    return getConfig()
}
上述代码中,getConfig() 将变量访问抽象为行为,未来可无缝切换至环境变量、配置中心等来源,而调用方无需修改。

4.3 构造函数属性(constructor)在GCC中的应用

GCC 提供的 `__attribute__((constructor))` 机制允许开发者指定在 `main` 函数执行前自动运行的函数,常用于模块初始化。
基本语法与使用

#include <stdio.h>

void __attribute__((constructor)) init() {
    printf("Initialization before main!\n");
}
该代码段中,`init` 函数被标记为构造函数,程序启动时优先调用。`__attribute__((constructor))` 告诉编译器将函数地址注册到 `.init_array` 段。
执行优先级控制
可指定优先级数值,数值越小越早执行:
  • __attribute__((constructor(1))):最高优先级组
  • __attribute__((constructor(100))):普通初始化
多个构造函数按优先级分组,同组内执行顺序未定义,需避免依赖。此特性广泛应用于插件注册、日志系统预加载等场景。

4.4 实践:设计线程安全的初始化保护机制

在多线程环境中,资源的延迟初始化常引发竞态条件。为确保仅一次初始化且全局可见,需引入同步控制。
双重检查锁定模式(Double-Checked Locking)
该模式减少锁竞争,适用于高并发场景:

public class Singleton {
    private volatile static Singleton instance;

    public static Singleton getInstance() {
        if (instance == null) {                  // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) {          // 第二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
volatile 关键字防止指令重排序,确保对象构造完成后才被引用。两次 null 检查避免每次获取实例都进入同步块,提升性能。
初始化保护的替代方案
  • 静态内部类:利用类加载机制保证线程安全,推荐用于单例
  • 显式锁 + 原子标志:适用于复杂初始化逻辑
  • Java 中的 AtomicReference 结合 CAS 操作实现无锁初始化

第五章:现代C语言中的最佳实践与总结

使用静态分析工具提升代码质量
集成如 cppcheck 或 clang-tidy 到开发流程中,可提前发现内存泄漏、未初始化变量等问题。例如,在 CI 流程中加入:
clang-tidy src/*.c -- -Iinclude
有助于强制执行编码规范。
优先使用 const 修饰只读数据
提高代码可读性并防止意外修改。例如,函数参数若不修改指针所指内容,应声明为 const:
void print_string(const char *str) {
    printf("%s\n", str); // str 不可被函数修改
}
避免裸 malloc,封装内存管理
直接调用 malloc 易导致泄漏。推荐封装分配与释放逻辑:
void* safe_malloc(size_t size) {
    void *ptr = malloc(size);
    if (!ptr) {
        fprintf(stderr, "Fatal: malloc failed\n");
        exit(EXIT_FAILURE);
    }
    return ptr;
}
采用 RAII 风格的 cleanup 机制
GCC 支持 cleanup 属性,可自动释放资源: ```c #define auto_free __attribute__((cleanup(free_ptr))) void free_ptr(void **ptr) { if (*ptr) free(*ptr); } // 使用示例 auto_free void *buffer = malloc(1024); // 离开作用域时自动释放 ```
错误处理策略统一化
推荐使用返回错误码而非全局 errno。定义统一枚举:
  • ERROR_NONE: 操作成功
  • ERROR_INVALID_ARG: 参数非法
  • ERROR_OUT_OF_MEMORY: 内存不足
  • ERROR_IO_FAILED: I/O 操作失败
结构化日志输出便于调试
引入轻量日志宏,区分级别并输出文件行号:
#define LOG(level, fmt, ...) \
    fprintf(stderr, "[%s:%d %s] " fmt "\n", __FILE__, __LINE__, level, ##__VA_ARGS__)
盘点那些好用的SAP FIORI App(二) -上传凭证Upload Journal Entry SAP FICO运维问题及解决方案分享 阅读详情

相关推荐

深入解读ATPG Pattern类型:除了Basic Scan,Clock PO和RAM Sequential模式怎么用?

本文深入解析ATPG高级Pattern类型,包括Clock PO和RAM Sequential模式的应用策略。通过Mentor DFT工具链中的Tessent平台,详细介绍了这些模式的工作原理、配置命令及实战案例,帮助提升芯片测试的故障覆盖率和效率。特别适用于处理时钟域交叉和嵌入式存储器的复杂电路测试需求。

weixin_27697385的博客 486

C语言中,声明一个变量并不对其初始化时,其值真是随机的吗?

在 C 语言中,当你声明一个变量但没有对它进行初始化时,其值是否“随机”取决于变量的存储类型和作用域。让我们详细分析这一情况。始终显式初始化变量是编写健壮代码的良好习惯,可以避免许多潜在的 bug 和未定义行为。的值可能不同,因为它取决于栈上该内存位置的残留数据。:所有未初始化的全局或静态变量都会被初始化为 0。)捕捉程序中对未初始化变量的访问。在调试时,可以使用工具(如。

小宝哥Code的专栏 1529

多孔材料吸附性质模拟程序RASPA的离线和在线安装方法

RASPA-2.0是今年美国西北大学教授Randall Q. Snurr等人开发的针对于MC,MD,分子力学优化等用途的程序,相比于之前开发的MUSIC软件,RASPA的功能更加齐全,操作更加简便,可以在MC的吸附过程中考虑骨架的柔性,也可以想MUSIC一样先制作积分格点(music中的map)。 A、离线安装(centos为例): (1)、安装之前要检查一下是否装了automake,

youyno的博客 1万+

C++基础:变量的声明、定义、初始化(对三个不同概念的深入解读)

摘要: 本文对比了Java与C++在变量声明、定义和初始化方面的核心差异。在Java中,这三种概念通常合而为一,变量必定会被初始化(自动或强制);而在C++中,它们被明确区分为不同阶段:声明(如extern)仅告知类型存在,定义才分配存储空间,初始化则可能延迟。关键差异在于: C++允许变量"只声明不定义"(通过extern)和"只定义不初始化"(局部变量可能未初始化); 初始化行为取决于变量位置(函数内外)和类型(内置/类类型),全局变量默认零初始化,局部内置类型变

Laurence的技术博客 1968

联想拯救者r7000p在ubuntu20.04未找到wifi适配器,安装rtl8852ae网卡驱动问题解决方案

新买的拯救者r7000p 2021款,装完ubuntu20.04之后显示未找到wifi适配器, 更换N次源之后还是只有一个显卡驱动,在网上找了很多方法,再自己折腾了一段时间后,总算是解决了这个问题。 1.设置bios 打开主板系统,将security boot设置为disenable,因为设计到修改内核配置,必须得关掉安全启动。 2.查询网卡状态 使用命令查询网卡(hardware of Internet)状态 lshw -C network 因为是双系统,在Windows下控制面板-设备管理器中可以

MCZ777的博客 1万+

PHP+txt文件存储简易留言板

留言板共三个文件: index.php---展示留言内容和收集表单 write.php---向txt文件写入数据 message.txt---存储留言数据 index.php用于展示留言内容、通过表单把用户输入的数据POST给write.php,write.php把内容写入message.txt。 index.php代码: <?php //设置时区 date_defau...

仿站、源码搭建/迁移技术博客 1031

关于c语言中未初始化的变量

int变量未初始化的默认初值,和变量的类型有关。 1局部变量,在未初始化情况下,初值为随机值。C规范对该初值并没有做规定,具体实现由编译器决定。如VC/VS等编译器,会将初始值值为0xCCCCCCCC, 而GCC等编译器则是不可预知的随机值,我用notepad++则为15. 2 静态局部变量,即带static修饰的局部变量。 全局变量和静态全局变量,即定义在函数外,不属于任何一个函数的变量。 这...

AM的博客 1万+

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2205

C语言全局变量未初始化都是0,为什么全局变量无须初始化,局部变量必须初始化...

满意答案ccc000267推荐于 2017.11.23采纳率:52%等级:8已帮助:712人这个说法本身就不对。变量需要不需要初始化是根据需要来进行的。全局变量有时也需要初始化,而局部变量其实大部分时间都没有初始化。不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/C++代码实现的,程序开始执行后才给变...

weixin_42121272的博客 6808

【Audio driver】深入解析mixer_paths.xml中的音频通路配置

本文深入解析了Android音频驱动开发中的核心配置文件mixer_paths.xml。文章以高通平台为例,详细阐述了音频通路(FE、BE、DSP、Device)的概念与连接逻辑,并通过实战案例拆解了扬声器与麦克风通路的配置方法、关键控件作用及调试技巧,是理解与定制Android音频系统的实用指南。

ik6789012的博客 358

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

C语言的全局变量为什么不能在函数外声明

C语言的全局变量为什么不能在函数外声明 要明白这个问题的原因,我们来看下面一段简单的代码: #include<stdio.h> #include<string.h> int a; a= 9; int main(){ printf("%d",a); return 0; } 从上面的代码我们看到我把a设置为了全局变量,并且在函数外声明了。结果就会出现这个警告(其实在别的编译器里这就是个错误提示): 其实之所以会出现这个错误,还是因为我们搞混了一个概念:虽然程序在函数内

weixin_44606440的博客 5411

成对使用离轴抛物面反射镜的设计

成对使用离轴抛物面反射镜的设计

weixin_72050316的博客 638

全局变量初始化顺序及注意事项

对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。        此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。所以,尽量不用全局变量;用静态变量,通过访问器进行访问。   例如:全局变量           int   a   =

macrohasdefined的专栏 8045

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言全局变量初始化顺序之谜(编译器从不告诉你的真相)

揭秘C语言中全局变量的初始化顺序难题,解析跨文件初始化依赖的底层机制与编译器行为差异。涵盖实际开发中的常见陷阱与规避策略,助你写出更稳定的C程序,值得收藏。

FuncLens的博客 720

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

全局变量,static变量初始化时间

原文 https://www.cnblogs.com/novice-dxx/p/7094690.html 本次上传主要是关于静态局部变量的初始化问题。 首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C...

hueru的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言全局变量与局部变量详解

宝剑锋从磨砺出,梅花香自苦寒来!

weixin_73233099的博客 1万+

全局变量和静态变量的初始化

首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中

weixin_45905650的博客 4447

【大型C项目避坑指南】:全局变量初始化顺序引发的链接时灾难

掌握C语言中全局变量的初始化顺序,避免跨文件依赖导致的链接时错误。适用于大型C项目开发,通过合理设计初始化逻辑和使用构造函数属性,确保稳定执行。解决模块间耦合难题,提升程序可靠性,值得收藏。

PixelWander的博客 973

你真的懂C语言启动流程吗?,全局变量初始化顺序全解析

掌握C语言启动流程的关键,解析C语言中全局变量的初始化顺序。涵盖编译期初始化、未初始化变量处理及构造函数调用顺序,适用于嵌入式开发与程序启动优化。理解底层机制,提升代码可靠性,值得收藏。

AlgoFun的博客 696

控制全局变量初始化顺序 && #pragma详解

控制全局变量初始化顺序转自:http://nathan.xuli.googlepages.com/cpp_global         全局变量的初始化分两种。一种是static initialization,用常量来初始化,在程序被load的时侯就完成了。另一种就是dynamic initialization,简单地说就是需要调一个函数来执行初始化,在CRT的启动代码中会完成这个工作。我

DoYou?'s csdn 4199

C语言全局变量初始化顺序难题:3个案例彻底搞懂构造函数调用逻辑

掌握C语言全局变量的构造函数顺序难题,通过3个典型实例解析初始化机制,厘清跨文件与依赖场景下的调用逻辑。深入编译原理,规避未定义行为,提升程序稳定性,值得收藏。

VarFun的博客 928

C语言中全局变量初始化顺序:99%开发者忽略的致命细节与解决方案

掌握C语言中全局变量的初始化顺序,避免程序未定义行为。详解跨文件初始化依赖的解决方案,涵盖编译期与运行期处理机制,提升代码稳定性。适用于大型项目开发,值得收藏。

CodeNexus的博客 782

【C语言全局变量初始化顺序揭秘】:深度解析跨文件初始化陷阱及最佳实践

掌握C语言中全局变量的初始化顺序,避免跨文件依赖导致的未定义行为。解析初始化阶段机制,涵盖编译时与运行时场景,揭示构造顺序陷阱及静态初始化最佳实践。提升程序稳定性,值得收藏。

ByteVein的博客 750

关于全局变量内存分配的顺序

全局变量内存分配的顺序我们知道C语言中,局部变量分配顺序是固定的,可是你有没有想过全局变量分配的顺序呢?没有,那么首先用2种方式运行下面的程序:#include #define ONE 1 // 0#if ONEint a, b;#elseint b, a;#endif // ONEvoid main(){#if ONEcout cout  #elsecout cout  #endif // ON

峰子的专栏 4091

main() 函数执行前,具体会初始化和创建哪些全局变量 ?

大部分全局变量都是在 `main()` 函数执行之前初始化和创建的,以确保程序在启动时拥有正确的运行环境。

侯仕奇的博客 1342
上一篇: 揭秘printf自定义格式符:如何在C语言中实现高效输出控制
下一篇: 【C语言内存安全关键】:数组参数长度传递错误导致崩溃的6大案例分析
FastSolve
博客等级 码龄1年 155粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值