定义变量时未初始化赋值的问题

本文通过一个C++示例展示了未初始化变量可能导致的问题,如保留前次数据或读取随机内存值。强调了变量初始化的重要性,并提供了结构体初始化的方法。

变量定义时未初始化,导致生命周期结束后,重新定义变量时,仍然保存有之前的数据,或者数据为内存中的随机值。

如下代码:

#include <iostream>
using namespace std;

typedef struct s_xy
{
    int x;
    int y;
} s_xy;

int main() {
    // your code goes here
    for(int i = 0; i < 3; ++i)
    {
        s_xy point;
        volatile int num;
        if(1 == i)
        {
            // int j = 1
            cout << i << ": FuZhi" << endl;
            num = 3;
            point.x = 1;
            point.y = 2;
        }
        cout << i << ": point.x: " << point.x << endl;
        cout << i << ": num: " << num << endl;
    }
    return 0;
}

以上代码的输出是:

编译器:http://ideone.com/gLxtqh

0: point.x: 1
0: num: 0
1: FuZhi
1: point.x: 1
1: num: 3
2: point.x: 1
2: num: 3

编译器gcc:

0: point.x: 687612(一个随机值)
0: num: 0
1: FuZhi
1: point.x: 1
1: num: 3
2: point.x: 1
2: num: 3

 

所以,一般情况下,定义变量时必须初始化,结构体需要:

memset(&struct_name, 0, sizeof(struct_name));

否则不能直接读取。

转载于:https://www.cnblogs.com/xiaochou/p/variable_initial.html

在C语言中,变量初始化赋值是两个相关但不同的概念。初始化是指在变量声明为其赋予一个初始值,而赋值则是在变量声明之后通过赋值操作符(如`=`)为其赋予新的值。以下是关于变量初始化赋值的详细说明及示例。 ### 变量初始化 初始化通常发生在变量定义的同,确保变量从一开始就具有一个明确的值。这种方式可以避免初始化变量带来的不确定行为。 - **显式初始化**:在声明变量直接为其赋值。 ```c int a = 10; // 整型变量的显式初始化 float b = 3.14f; // 浮点型变量的显式初始化 char c = 'A'; // 字符型变量的显式初始化 ``` - **隐式初始化**:某些情况下,编译器会为全局变量或静态变量自动进行默认初始化(例如整型变量默认为0)。 ```c static int d; // 静态变量的隐式初始化,默认值为0 ``` ### 变量赋值 赋值是指在变量已经声明的前提下,使用赋值操作符`=`将其绑定到一个新的值上。这种方式可以在程序运行过程中动态地修改变量的值。 - **基本数据类型的赋值**: ```c int e; e = 20; // 声明后进行赋值 float f = 5.67f; // 初始化 f = 8.9f; // 再次赋值 ``` - **结构体的初始化赋值**: 结构体是一种复合数据类型,其成员可以是不同的数据类型。结构体变量初始化可以在定义完成,也可以在后续进行赋值。 ```c struct Point { int x; int y; }; struct Point p1 = {1, 2}; // 定义初始化结构体变量 struct Point p2; p2.x = 3; // 赋值x成员 p2.y = 4; // 赋值y成员 ``` - **数组的初始化赋值**: 数组的初始化可以通过指定初始值列表来完成,而赋值则需要逐个元素进行。 ```c int arr[5] = {1, 2, 3, 4, 5}; // 初始化数组 int arr2[5]; arr2[0] = 10; // 赋值第一个元素 arr2[1] = 20; // 赋值第二个元素 ``` ### 示例代码 以下是一个完整的示例,展示了变量初始化赋值过程: ```c #include <stdio.h> struct Point { int x; int y; }; int main() { // 基本数据类型的初始化赋值 int a = 10; // 初始化 int b; b = 20; // 赋值 float c = 3.14f; // 初始化 c = 2.71f; // 再次赋值 // 结构体的初始化赋值 struct Point p1 = {1, 2}; // 初始化结构体 struct Point p2; p2.x = 3; // 赋值x成员 p2.y = 4; // 赋值y成员 // 输出结果 printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %.2f\n", c); printf("p1: x = %d, y = %d\n", p1.x, p1.y); printf("p2: x = %d, y = %d\n", p2.x, p2.y); return 0; } ``` ### 总结 - 初始化是在变量声明赋予初始值的过程,有助于避免定义行为。 - 赋值是在变量声明后通过操作符`=`改变其值的过程。 - 对于复杂的数据结构(如结构体、数组),初始化赋值的方式略有不同,需根据具体情况进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值