C中未初始化的局部变量的默认值

时间:2018-06-30 17:29:21

标签: c variables initialization

我正在努力弄清C语言中变量的声明和定义。我从学校学到的材料说,全局未初始化变量的赋值为0,而未初始化局部变量的赋值是未赋值的,并且该值存在于该内存地址中。

但是,我尝试了以下非常简单的程序:

function fileDownload(id, callback){
    info(id, function(res){
        if(!res.error){
            info(id, function(res){
                if(!res.error){
                    //console.log(res.data);
                    var d = JSON.parse(res.data);
                    //console.log(d['file_name']);
                    var url2 = baseurl + "/api/file/" + id ;
                    var r = request(url2);
                    r.on('response',  function (res) {
                        res.pipe(fs.createWriteStream('./' + d['id'] + d['file_name']));
                        console.log("Download Done: " + './' + d['id'] + d['file_name']);
                        return callback({success:true, data:d['id'] + d['file_name']});
                    });
                }else{
                    console.log("ERROR: " + res.data)
                    return callback({success:false, data: res.data});
                }
            });
        }else{
            console.log("ERROR: " + res.data)
            return callback({success:false, data: res.data});
        }
    });

};

输出如下:

#include <stdio.h>

void something(){

    int third;
    int fourth;

    printf("third: %d\n", third);
    printf("fourth: %d\n", fourth);
}

int main(){
    int first;
    int second;

    printf("first: %d\n",first);
    printf("second: %d\n",second);
    something();
    return 0;
}

第二次运行:

first: 382501330
second: 32766
third: 0
fourth: 0

观察:

  • 变量“ first”似乎每次都按预期分配一个随机数

  • 变量'second'每次都被分配相同的数字(32766),为什么?

  • 为什么变量“ third”和“ fourth”被分配为零,因为它们是局部变量,而不是全局变量?

1 个答案:

答案 0 :(得分:1)

您正在访问可能已声明为register的未初始化的本地。 这是未定义行为。您的程序不再有意义。

如果通过撒一些&运算符来解决问题(这样就可以不再声明register为本地人了)

#include <stdio.h>

void something(){

    int third;
    int fourth;

    printf("third: %d\n", *&third);
    printf("fourth: %d\n", *&fourth);
}

int main(){
    int first;
    int second;

    printf("first: %d\n", *&first);
    printf("second: %d\n", *&second);
    something();
    return 0;
}

那么就C而言,这些值是不确定的。您将得到的取决于您的环境 以及在调用main之前,主调用libc例程在堆栈中保留了什么。