我正在努力弄清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”被分配为零,因为它们是局部变量,而不是全局变量?
答案 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例程在堆栈中保留了什么。