精华内容
下载资源
问答
  • C语言变量未初始化问题
    2021-05-20 06:07:42

    //vararr2d.c -- 使用变长数组?

    #include

    #define ROWS 3

    #define COLS 4

    int sum2d (int rows, int cols, int ar[rows][cols]);

    int main(void)

    {

    int i, j;

    int rs = 3;

    int cs = 10;

    int junk[ROWS][COLS] = {

    {2, 4, 6, 8},

    {3, 5, 7, 9},

    {12, 10, 8, 6}

    };

    int morejunk[ROWS-1][COLS+2] = {

    {20, 30, 40, 50, 60, 70},

    {5, 6, 7, 8, 9, 10}

    };

    int varr[rs][cs]; // 变长数组

    for (i = 0; i < rs; i ++){

    for (j = 0; j < cs; j ++){

    varr[i] [j] = i * j + j;

    }

    }

    printf("2x6 arry\n"); //**第一次**

    printf("Sum of all element = %d\n",

    sum2d(ROWS -1, COLS + 2, morejunk));

    printf("3x5 array\n"); //**第二次**

    printf("Sum of all element = %d\n",

    sum2d(ROWS, COLS, junk));

    printf("3x10 VLA\n");

    printf("Sum of all element = %d\n",

    sum2d(rs, cs, varr));

    return 0;

    }

    //带有一个VLA参数的函数

    int sum2d(int rows, int cols, int ar[rows][cols])

    {

    int r;

    int c;

    int tot;

    for (r = 0; r < rows; r ++){

    for (c = 0; c < cols; c ++){

    tot += ar[r][c];

    }

    }

    return tot;

    }

    在上面的代码中, 被调用的函数的里的 tot 变量没有初始化,会导致最后的结果出问题。

    但是为什么只是第一次调用之后出现了问题,而第二次第三次都没有出现问题?

    是不是tot 在sum2d函数第一次被调用结束后自动被初始化为零?

    希望前辈们能指点一下或者给一个方向。谢谢 :)

    更多相关内容
  • C语言中,未初始化局部变量到底是多少? 答案往往是: 与编译器有关。 可能但不保证初始化为0。 确定。 总之,全部都是些一本正经的形而上答案,这很令人讨厌。 但凡一些人给你滔滔不绝地扯编译器,C库,...
  • C语言未初始化局部变量是多少?

    千次阅读 多人点赞 2020-07-17 17:41:15
    C语言中,未初始化局部变量到底是多少? 答案往往是: 与编译器有关。 可能但不保证初始化为0。 确定。 总之,全部都是些一本正经的形而上答案,这很令人讨厌。 但凡一些人给你滔滔不绝地扯编译器,C库,...

    C语言中,未初始化的局部变量到底是多少?

    答案往往是:

    • 与编译器有关。
    • 可能但不保证初始化为0。
    • 未确定。

    总之,全部都是些一本正经的形而上答案,这很令人讨厌。

    但凡一些人给你滔滔不绝地扯编译器,C库,处理器体系结构却给不出一个实际场景复现问题的时候,这人大概率在扯淡。

    又是周五回家时,大巴车上作短文一篇。

    其实,这个问题本身就是错误的问法,说全了能讲10万字,我们只要能在特定场景下确定其特定行为就OK了,当然,这就需要设计一个比较OK的实验。

    在演示一个实际代码行为之前,先给出一个知识, CPU不认识变量,更无法识别变量的名字,CPU只会从特定的内存位置取值或者将值存到特定的内存位置,因此当问一个变量的值是多少的时候,必须要知道这个变量对应的值被保存在什么地方。

    来看下面的代码:

    #include <stdio.h>
    
    void func1()
    {
    	int a;
    	printf("func1:%d\n", a);
    	a = 12345;
    }
    
    void func2()
    {
    	int b;
    	printf("func2:%d\n", b);
    }
    
    void func4()
    {
    	int d;
    	printf("func3:%d\n", d);
    }
    
    void func3()
    {
    	int c;
    	printf("func3:%d\n", c);
    	c = 54321;
    	func4();
    }
    
    void test_call()
    {
    	func3();
    }
    
    int main(int argc, char **argv)
    {
    	func1();
    	func2();
    
    	test_call();
    }
    

    我们有func1~func4一共4个函数,其内部均有一个未初始化的局部变量,它们的值到底是多少呢?

    对于这种局部变量,它们的值取决于:

    • 变量在栈中的位置。
    • 变量对应的栈位置在 之前 有没有被store过。

    可以看到,上述第一点标记了一个内存位置,第二点则是代码的行为,也就是说,只要有代码去store对应的位置, 且后续的代码没有reset该位置的值的话,该位置就会保留着原先被store后的值。

    验证非常简单,试一下就知道了:

    [root@localhost test]# ./a.out
    func1:0
    func2:12345
    func3:0
    func3:0
    

    按照函数调用栈帧的变化,func1的局部变量a和func2的局部变量b显然是位于同一个位置的,在func1被调用时,这是一块新的内存(可能在进入main之前有栈帧到达过这个位置),a的值取决于调入内存该位置的页面对应偏移的初始值,这取决于操作系统:

    • 操作系统在分配给程序页面时可能会将页面clear为零页。

    栈的分配不会涉及C库,这里显然并不涉及C库的行为,但类似malloc分配的内存则涉及C库了。

    打印结果,a的值为0,我们认为操作系统返回给了应用程序零页。接下来在func1中将其赋值12345之后函数返回,接下来调用func2的时候,在之前func1已经退出的栈帧位置重建栈帧,对应位置依然还是12345。

    我没有看到func1的ret操作后面有stack清0的代码指令。效率考虑,也不该有这样的指令。

    再看test_call函数,很明显,func3和func4调用使用的并不是同一个栈帧,因此即便是在func3中对c赋值了54321,也不会影响在其栈帧之上的func4的栈帧对应位置的值d。因此c和d的初始值均保持为0。

    那么,初始化一个局部变量和不初始化一个局部变量,在指令层面上,区别在哪里呢?

    很简单,亲眼看一下就知道,先看未初始化局部变量的func1:

    // int a;
    00000000004005ad <func1>:
      4005ad:   55                      push   %rbp
      4005ae:   48 89 e5                mov    %rsp,%rbp
      4005b1:   48 83 ec 10             sub    $0x10,%rsp
      4005b5:   8b 45 fc                mov    -0x4(%rbp),%eax
      4005b8:   89 c6                   mov    %eax,%esi
      4005ba:   bf 90 07 40 00          mov    $0x400790,%edi
      4005bf:   b8 00 00 00 00          mov    $0x0,%eax
      4005c4:   e8 b7 fe ff ff          callq  400480 <printf@plt>
      4005c9:   c7 45 fc 39 30 00 00    movl   $0x3039,-0x4(%rbp)
      4005d0:   c9                      leaveq
      4005d1:   c3                      retq
    

    再看初始化局部变量a为2222的版本:

    // int a = 2222;
    00000000004005ad <func1>:
      4005ad:   55                      push   %rbp
      4005ae:   48 89 e5                mov    %rsp,%rbp
      4005b1:   48 83 ec 10             sub    $0x10,%rsp
      4005b5:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
      4005bc:   8b 45 fc                mov    -0x4(%rbp),%eax
      4005bf:   89 c6                   mov    %eax,%esi
      4005c1:   bf 90 07 40 00          mov    $0x400790,%edi
      4005c6:   b8 00 00 00 00          mov    $0x0,%eax
      4005cb:   e8 b0 fe ff ff          callq  400480 <printf@plt>
      4005d0:   c7 45 fc 39 30 00 00    movl   $0x3039,-0x4(%rbp)
      4005d7:   c9                      leaveq
      4005d8:   c3                      retq
    

    仅仅差了一条指令:

      4005b5:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
    

    初始化的操作是依靠实实在在的指令完成的。


    总结一句, 函数返回在pop出当前栈帧的时候,并不会清理它遗留在栈帧里的数据,下个函数调用再次重用到该栈帧的内存时,未初始化的局部变量将会被遗留数据影响,从而变得不确定!

    所以,记得初始化你的局部变量。如果你不这样做,上帝终究会将你经理了的。


    浙江温州皮鞋湿,下雨进水不会胖。

    展开全文
  • C语言中变量未初始化的处理

    千次阅读 2022-02-11 10:44:46
    实例测试1--DEV-C++环境 : #include <stdio.h> //全局整形变量 int int_var1; static int stc_int_var1;... //局部整形变量 int int_var2; static int stc_int_var2; short int sht_int_var2

    实例测试1--DEV-C++环境 :

    #include <stdio.h>
    //全局整形变量 
    int int_var1;
    static int stc_int_var1;
    short int sht_int_var1;
    long int log_int_var1;
    //全局指针变量
    char *int_opt1;
    
    int main()
    {
    	//局部整形变量 
    	int int_var2;
    	static int stc_int_var2;
    	short int sht_int_var2;
    	long int log_int_var2;
    	//局部指针变量
    	char *int_opt2;//局部指针变量不初始化打印不出来 
    	printf("int_var1=%d,stc_int_var1=%d,sht_int_var1=%hd,log_int_var1=%ld,int_opt1=%s\n", int_var1, stc_int_var1, sht_int_var1, log_int_var1, int_opt1);//全局变量 
    	printf("int_var2=%d,stc_int_var2=%d,sht_int_var2=%hd,log_int_var2=%ld,int_opt2=%s\n", int_var2, stc_int_var2, sht_int_var2, log_int_var2, int_opt2);//局部变量 
    	return 0;	
    } 

    修改:将局部字符指针初始化 char *int_opt2 = NULL;

    总结1:

            Dev-C++环境下,全局未初始化变量均设置为默认值(int类型默认值0;字符指针默认null)

            局部未初始化变量,整形设置默认值0;指针未初始化变量不打印不报错!

    实例测试2--GCC环境

    #include <stdio.h>
    //全局整形变量 
    int int_var1;
    static int stc_int_var1;
    short int sht_int_var1;
    long int log_int_var1;
    //全局指针变量
    char *int_opt1;
    
    int main()
    {
    	//局部整形变量 
    	int int_var2;
    	static int stc_int_var2;
    	short int sht_int_var2;
    	long int log_int_var2;
    	//局部指针变量
    	char *int_opt2;
    	printf("int_var1=%d,stc_int_var1=%d,sht_int_var1=%hd,log_int_var1=%ld,int_opt1=%s\n", int_var1, stc_int_var1, sht_int_var1, log_int_var1, int_opt1);//全局变量 
    	printf("int_var2=%d,stc_int_var2=%d,sht_int_var2=%hd,log_int_var2=%ld,int_opt2=%s\n", int_var2, stc_int_var2, sht_int_var2, log_int_var2, int_opt2);//局部变量 
    	return 0;	
    } 

    修改:随机去掉两个局部变量

    总结2:

            GCC环境下,全局未初始化变量设置默认值(int类型默认值0;字符指针默认null)

            局部未初始化变量有时设置随机值或者默认值

    实例测试3--VS2013环境:

     总结3:

            VS2013环境,全局未初始化变量设置默认值(int类型默认0,指针默认null)

            局部未初始化变量只定义不使用(警告);定义+使用(报错)

    总结:

            1. 局部变量未初始化,初值为随机值:C规范对该初值并没有做规定,具体实现由编译器决定。

            2.全局变量未初始化,默认设置为初值。

            3.局部未初始化变量,编译通过与否与具体编译环境相关。

    结论:无论任何时候,变量初始化!

    展开全文
  • Java中变量未初始化问题

    千次阅读 2021-11-02 17:24:15
    Int类型默认值为0,你定义的是方法内的局部变量,需要初始化才能进行运算。 例子: public class Main { int var1 = 1; int var2; // 类成员变量 public static void main(String[] args) { int var3 = 3; Main...

    今天遇到一个Java变量未初始化就使用的问题,后详细了解后才明白。

    Java中只有类成员变量才会默认初始化值。Int类型默认值为0,你定义的是方法内的局部变量,需要初始化才能进行运算。

    例子:

    public class Main {
        int var1 = 1;
        int var2;   // 类成员变量
        public static void main(String[] args) {
            int var3 = 3;
            Main main =  new Main();
            System.out.println(main.var1+main.var2+var3); // 4
    
        }
    
    

    输出结果:

    4
    
    展开全文
  • 当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch一条长语句需要换行写,可以在行的末尾加入反斜杠 表示;...变量有全局变量、局部变量,全局变量系统默认初始化局部变量不会自...
  • 错误:使用了未初始化局部变量

    千次阅读 2021-10-07 10:14:13
    typedef struct MatrixGraph* PtrToMatrixGraph;...//此处报错:使用了未初始化局部变量 Graph->VertexNum = VertexNum; 原因:没有为其分配地址Graph = (MGraph)malloc(sizeof(struct MatrixGraph ));
  • //C4700: 使用了未初始化局部变量“s” //这是c++的重要准则,凡指针被使用,必先初始化指针 //将其改成char s[50];后,就给指针型变量s一个初始化的机会, //类似数组初始化与指针类型数组声明区别,给定具体容量...
  • ``` class Entity { public: ...编译时会报错:“使用了未初始化局部变量‘e’”,但如果调换最后两行代码 ``` e.Print(); std::cout ; ``` 就能编译通过。 为什么第二种方法不会报错?
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法...答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量初始化可以划分为以下两
  • 在刚开始学习Java的时候,就了解了Java基础中的变量,虽然知道这个以后会经常用到,但没想到了基本语法这里,竟然又冒出来了成员变量和局部变量。变来变去太容易让人搞晕了,今天我们就挑拣出来梳理一下!
  • java中局部变量没有初始值,运行时会直接报错:java: 可能尚未初始化变量a,就算打印了也无济于事,还会报错。要解决的方法是: 给a赋初始值。注意:java中的局部变量一定要赋初始值。编译运行后就会在控制台会出现...
  • 在C语言程序中,未初始化局部变量值是未定义(UB,undefined behaviour)的,使用未初始化的变量可能会为程序带来意想不到的错误,这一点看过我文章的读者应该都是清楚的。使用未初始化的变量可能会为程序带来...
  • 准备找工作面试了,复习复习归并排序。自己写了一个,漏洞百出,但是最致命点是。...我将这个倒霉的变量初始化后,问题解决啦。现在反过来看,其实还是指针越界啦。由于初始化,所以变量初始值为垃圾数字,...
  • 写一个简单的累加代码时,遇到了以下问题 int add_range(int low, int high) { int i,sum; for ( i = low; i <= high; i++) ...这样写时会出现C4700的报错,原因是开始没有对sum进行赋值 ......
  • //全局变量始终指向刚刚访问过的结点 BiThrTree pre; //创建一颗二叉树,默认先序遍历 void CreateBiThrTree(BiThrTree T) { char c; scanf("%c", &c); if(c==' ') { T = NULL; } else { T = (BiThrNode*)malloc...
  • C4700 使用了未初始化局部变量

    万次阅读 2020-04-13 22:46:43
    C4700 使用了未初始化局部变量 我在使用VS2019编写C++程序时,碰到如下情况: 问题所在: 解决方法:我进入这个函数查看该函数的声明,发现这样就可以解决了,如下: 只要把当中的list l改成list& l就可以...
  • C++:错误 C4700 使用了未初始化局部变量“ ”

    万次阅读 多人点赞 2020-03-24 23:11:49
    错误:C4700 使用了未初始化局部变量 通常认为若未初始化变量,编译器会自动给变量提供一个默认初始值. 数据类型 默认初始值 int/float/double 0 char ‘\0’ pointer NULL 对于指针类型来说,...
  • #include using namespace std; int power(int, int); // 函数定义 int power(int num1, int num2) { int result; for (int i = 0; i ;... } 出现错误 解决方法,给result变量赋值 int result = 1;
  • studio中运行 提示 使用了未初始化局部变量“y” 在VC6.0可以正常运行求大神解答以下是程序的局部void main(){char ch1, ch2;SqStack *s1, *s2;LQueue *q;ELEMTP x, y;s1 = (SqStack *)malloc(sizeof(SqStack));s2...
  • 在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量...静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(这一点非常的重要);静态局部变量一般在声明处初始化
  • ``` else if(e.getSource()==savedia){ String fname="error.txt",fcontent; FileOutputStream fout; File floc; SimpleDateFormat ...斜粗体的局部变量floc会有可能尚未初始化的错误,求大神解决
  • C++报错:C4700:使用了非初始化局部变量

    万次阅读 多人点赞 2018-10-12 23:25:16
    使用了非初始化局部变量 。 报错原因 以前遇到过这种情况,指的是定义一个变量,结构体,对象等,未初始化就进行操作,会报这个错误。还有一种情况就是, 在函数调用过程中,如果参数不是引用调用,那就...
  • C++未初始化变量

    万次阅读 多人点赞 2018-04-12 22:16:45
    个人主页:AnAoU.com最开始学习C/C++时候没有注意到这个问题,只是单纯的以为未初始化变量,编译器默认...给大家看张图:我觉得这张图片说的很好,如果未初始化变量为全局变量的话,编译器会默认给附上0的值,这...
  • 全局变量在整个源文件的作用域都是有效的,只需要在一个源文件中定义全局变量,在其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。 也可以在一个源文件中定义这个全局变量,在头文件中用...
  • C++ 未初始化变量引发的问题

    千次阅读 2020-11-29 00:29:02
    最近在使用 CMake 重构一个 VisualStudio 项目,发现重构后的项目总是在运行期奔溃,错误发生...一下明白了,可能是由于结构体归零化,于是在构造函数中对变量m_yuvPictureDst初始化后就解决问题了。 题外话 一定要
  • 即使exec或exec [0]为非null,也无法保证ScheduledFuture对象甚至已经正确初始化-是的,即使内部线程可能正在运行.这是非常危险的,可能会工作一段时间,但是当您转移到具有更多核心的体系结构或在不同的负载环境下生产...
  • Java成员变量、局部变量的默认值和初始化

    千次阅读 多人点赞 2019-07-24 11:54:46
    转载:https://blog.csdn.net/qq_24644517/article/details/82288493 package deep; public class DefaultValue { // 实例成员变量 private boolean bool; private byte b; private short s; private ...
  • vs2019使用函数指针时编译出现了“使用了可能未初始化的本地指针变量” ? /********************************************************* * 文件名:MyCalc.h * 作者:WartenSIE * 时间:2021-11-13 * 描述:加减...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,908
精华内容 67,163
关键字:

局部变量未初始化怎么解决