精华内容
下载资源
问答
  • C4700 使用未初始化局部变量

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

    C4700 使用了未初始化的局部变量

    我在使用VS2019编写C++程序时,碰到如下情况:

    在这里插入图片描述

    问题所在:

    在这里插入图片描述
    解决方法:我进入这个函数查看该函数的声明,发现这样就可以解决了,如下:

    在这里插入图片描述
    在这里插入图片描述
    只要把当中的list l改成list& l就可以了。

    具体原因我也不是很清楚,希望在往后的学习中能够搞清楚到造成这个结果的原因。

    展开全文
  • 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出当前栈帧的时候,并不会清理它遗留在栈帧里的数据,下个函数调用再次重用到该栈帧的内存时,未初始化的局部变量将会被遗留数据影响,从而变得不确定!

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


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

    展开全文
  • 错误:C4700 使用未初始化局部变量 通常认为若未初始化变量,编译器会自动给变量提供一个默认初始值. 数据类型 默认初始值 int/float/double 0 char ‘\0’ pointer NULL 对于指针类型来说,...

    今天编译的时候出了这个问题,发出来自己记录一下也分享一下。
    错误:C4700 使用了未初始化的局部变量

    通常认为若未初始化变量,编译器会自动给变量提供一个默认初始值.

    数据类型 默认初始值
    int/float/double 0
    char ‘\0’
    pointer NULL

    对于指针类型来说,未初始化时不可进行对内容赋值操作。

    下面展示一次指针类型错误实例。

    	char* name1, * name2, * name3,*name;
    	/*name1 = new char;
    	name2 = new char;
    	name3 = new char;
    	name = new char;*/
    	
    	cin.getline(name1,10);
    	cin.getline(name2,10);
    	cin.getline(name3,10);
    

    这时编译器会报错,其原因为要先为指针动态分配地址,即初始化指针。当把注释里的内容释放出来,编译器不会再报错。

    (其实这算是一个初学者对自己编程的错误记录,若有什么错误请指出,谢谢大家啦)

    展开全文
  • ``` class Entity { public: ...编译时会报错:“使用未初始化局部变量‘e’”,但如果调换最后两行代码 ``` e.Print(); std::cout ; ``` 就能编译通过。 为什么第二种方法不会报错?
  • error C4700: 使用未初始化局部变量“alpha”
    error C4700: 使用了未初始化的局部变量“alpha”
    展开全文
  • 优哉游哉,辗转反侧,万般无奈之下,我只看到一个未初始化局部变量。我将这个倒霉的变量初始化后,问题解决啦。现在反过来看,其实还是指针越界啦。由于未初始化,所以变量初始值为垃圾数字,...
  • weak symbol:未初始化的全局变量strong symbol:函数名,初始化的全局变量linker解决按3条规则解决此问题1,多个相同名称的strong symbol是不被允许的2,一个strong symbol和多个weak symbol相同,...
  • typedef struct DIR {  CString str; }WATCHDIR, *PWATCHDIR; PWATCHDIR pDir; pDir->str = "E:\\";...warning C4700: 使用未初始化局部变量“pDir” 运行的时候出现一个错误: Run-Time Check F
  • C++报错:C4700:使用了非初始化局部变量

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

    千次阅读 2018-10-22 19:00:10
    1局部变量,在未初始化情况下,初值为随机值。C规范对该初值并没有做规定,具体实现由编译器决定。如VC/VS等编译器,会将初始值值为0xCCCCCCCC, 而GCC等编译器则是不可预知的随机值,我用notepad++则为15. 2 静态...
  • 1.对于下面这个局部变量未初始化使用的问题int x = x; 经调试,结果如下: int x = 5; int TestGlobal() {  int x = x;  return x; } 如果在Debug模式下,编译时“warning C4700: 使用未初始化局部...
  • ``` else if(e.getSource()==savedia){ String fname="error.txt",fcontent; FileOutputStream fout; File floc; SimpleDateFormat ...斜粗体的局部变量floc会有可能尚未初始化的错误,求大神解决
  • C++未初始化变量

    万次阅读 多人点赞 2018-04-12 22:16:45
    个人主页:AnAoU.com最开始学习C/C++时候没有注意到这个问题,只是单纯的以为未初始化变量,编译器默认...给大家看张图:我觉得这张图片说的很好,如果未初始化变量为全局变量的话,编译器会默认给附上0的值,这...
  • 使用了可能未初始化的本地指针变量“old” 右键——>选择属性 SDL检查:更改为否
  • C#使用赋值的局部变量

    千次阅读 2019-10-12 14:16:24
    错误 1 使用赋值的局部变量
  • 配置C/C++ SDL检查设置成否
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法...答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量初始化可以划分为以下两
  • 局部变量初始化议题讨论

    千次阅读 2008-06-12 17:51:00
    局部变量初始化规则和现实中跨编译单元的初始化顺序依赖的几种解决方案。 文中的内容都源自一些C++书籍(BS的TCPL,Sutter的Exceptional系列),库的源代码和MSDN。 1.非局部变量的定义 非局部变量包括全局...
  • 实在知乎上看的答案,感觉很好,就转载一下,原文地址: 为什么全局变量无须初始化局部变量必须初始化? https://www.zhihu.com/question/30516949Intopass回答一:首先 Java 语言就是这么规定的。然后为什么 ...
  • c++中变量未初始化的隐患

    千次阅读 2018-03-06 15:42:08
    变量未初始化是C++编程中最为常见和易犯的错误之一。但是对于全局变量,我们可以不进行初始化,这个变量会默认的用零...全局变量和局部变量初始化与不初始化的区别 即int x 和 int x=0的区别。int x =0; 跟 int x;...
  • 转载:https://blog.csdn.net/qq_24644517/article/details/82288493 package deep; public class DefaultValue { // 实例成员变量 private boolean bool; private byte b; private short s; private ...
  • 变量未初始化是C++编程中最为常见和易犯的错误之一。但是对于全局变量,我们可以不进行初始化,这个变量会默认的用零进行...全局变量和局部变量初始化与不初始化的区别 即int x 和 int x=0的区别。int x =0; 跟 int x;
  • 我上慕课依照老师的代码敲得,我的会报错说未初始化变量,而老师的却能够正常运行 #include<iostream> #include<cmath> using namespace std; int main() { double a, b, c; double s, A; s = (a +...
  • 转自:... ... 问题描述: 在用VS2012编译时出现下面的错误 error C4703: 使用了可能未初始化的本地指针变量“eocd”   问题分析:   在VS2012创建项目时,会有一个勾选项,叫做“...
  • 在编译caffe的Windows版本时,遇到一个奇怪的问题提示:error C4703: 使用了可能未初始化的本地指针变量“db” 网上查阅资料后找到了相应的解决方法。可参考:http://www.vcerror.com/?p=1514 问题产生的原因...
  • 局部变量与成员变量的初始化 对于方法体内的局部变量,Java用一个编译时错误来提醒初始化: void fun(){ int x; x++;//报错:i not initialized } 对于类中的成员变量,在声明类的对象时,每个基本类型的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,019
精华内容 59,207
关键字:

使用了未初始化的局部变量怎么解决