用vs2017编译总是提示未初始化指针变量初始化形式

如何使用VS Code上编译运行C/C++程序
Getting Started
安装微软C/C++插件
在VS Code的扩展图标里搜索c++,安装C/C++插件并重载VS Code:
重启VS Code之后,打开一个含c/c++的文件夹,VS Code将会创建一个名为.vscode的子文件夹用于存放配置文件。
此C/C++插件是不包含C++编译器与调试器的,编译与调试需要额外安装工具。最受欢迎的几款C++编译器分别为 MinGW(Windows),XCode(macOS),和GCC()。
去官网下载安装器,安装好后选择需要安装的工具:
选择好之后应用更改:
然后修改的环境变量,将可执行文件目录加入到Path中:
为实现代码补全,需要创建一个c_cpp_properties.json文件。新建一个hello.c,输入:
int main(void)
printf(&hello&);
getchar();
VS Code会提示找不到头文件,点击错误处的小灯泡,编辑包含路径:
在c_cpp_properties.json中修改Win32下的路径设置:
&browse&: {
&${workspaceRoot}&,
&C:\\DevProgram\\MinGW\\lib\\gcc\\mingw32\\6.3.0\\include\\c++&
&limitSymbolsToIncludedHeaders&: true,
&databaseFilename&: &&
返回编辑器,点击小灯泡,将头文件所在目录添加到包含路径中:
构建程序需要创建一个tasks.json文件,点击任务-&配置任务:
在弹出的选项中选择Others,然后修改tasks.json:
&version&: &2.0.0&,
&tasks&: [
&taskName&: &build hello&,
&type&: &shell&,
&command&: &g++&,
&-g&, &hello.c&
&group&: {
&kind&: &build&,
&isDefault&: true
调试代码需要创建一个launch.json文件,点击调试栏的齿轮图标:
修改launch.json:
&version&: &0.2.0&,
&configurations&: [
&name&: &(gdb) Launch&,
&type&: &cppdbg&,
&request&: &launch&,
&program&: &${workspaceFolder}/a.exe&,
&args&: [],
&stopAtEntry&: false,
&cwd&: &${workspaceFolder}&,
&environment&: [],
&externalConsole&: true,
&MIMode&: &gdb&,
&miDebuggerPath&: &C:\\DevProgram\\MinGW\\bin\\gdb.exe&,
&setupCommands&: [
&description&: &Enable pretty-printing for gdb&,
&text&: &-enable-pretty-printing&,
&ignoreFailures&: true
&preLaunchTask&: &build hello&
返回编辑器,设置断点,按F5开始调试:vs2012 为什么提示 使用了未初始化的局部变量_百度知道
vs2012 为什么提示 使用了未初始化的局部变量
第一个为什么提示我使用了未初始化的局部变量 ,而第二个却没有提示啊?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
仔细查看下,你的 weight 没有初始化啊,所以 &weight 就会错的,如果 你赋值 float weight=0;就不会有问题了,不知道是否可以帮到你
可能是我没说清楚
上边是两张图
第一张图上的代码提示了我使用了未初始化的局部变量“i”
第二个是完全没有问题的!这才是我疑惑的地方
恭喜你啊,明白了。&i
指针类的问题,要小心,不然取的是地址还是数值分开。明白就好
采纳率:66%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
局部变量的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。指针初始化时设置为0和NULL的区别?求高手解答~_百度知道
指针初始化时设置为0和NULL的区别?求高手解答~
为什么要把指针设为NULL而不是0?为什么要把指针设为0不设为NULL?也就是说什么时候应该把指针设为0,什么时候把指针设为NULL?编写程序时,把指针设为有什么作用(意思)?
有个高手给了我一个答案,我觉得很不错,就分享出来和大家共享下~是一个叫poseidon_k的朋友帮助我的,下面共享他的解释:0是一个数字,本身有着一些原生的特性诸如:起始,没有,正负的分界线,0/1中的0还可以表示否定。
NULL用于将指针指定为空指针,也就是说该指针不指向任何对象,不可以对该指针进行解引用,否则系统会报错。
很巧合并且可能令人迷惑的是,在Windows环境下,NULL正好被定义为0,对于Windows程序,将指针初始化为0或NULL的作用是相同的,都使指针无效。这是因为Windows的内存管理将0x地址设为无效内存,不允许代码对它进行读写。仅仅微软的一个定义,令不少人误以为NULL和0有着天生的紧密关系,这显然是一个历史的误区。
既然设计NULL是为了满足将指针规定为无效的逻辑上的功能,那么假如某个系统指定无效内存地址为0x,那么基于这个系统的编译器就很有可能将NULL定义为0x,这时0和NULL就不能等同了。
千万记住,0以及其他所有数字在编程中仅仅是一个常量,并不一定具有某一逻辑上的功能。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
呃,你可以这样理解,NULL 是关键字,如果将指针的值设置为null,即代表当前指针为空指针,其不指向内存中的任意地址,而当指针设置为0时,其实质是在内存中申请一片空间,将0放入,然后将0的内存地址赋给指针,指针使用前都要初始化,而许多程序员在申明指针或者初始化时都喜欢赋值null,这是良好的编程习惯,因为如果你不给指针初始化,指针会随机的指向内存中的任何一个地址,这就是俗称的“指针指飘了”,在现在的计算机系统中是没什么的,但是早期的计算机系统中轻则内存泄漏,重则系统崩溃(现在的操作系统一般都会由系统或者编译器报错的),如果还不明白,请继续追问,谢谢
采纳率:64%
#define NULL 0NULL即0
主要看你心情爽不爽而决定用哪个NULL就是0,0就是NULL叫你的学名也是叫,叫你的小名也是叫两个为一区别就是NULL 比较专业一点,大多数编程语言都定义NULL为空的意思。如果你写一个int * p = 0 你告诉我你定义的是NULL 谁知道了啊
1条折叠回答
为您推荐:
其他类似问题
您可能关注的内容
初始化的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。error C4703: 使用了可能未初始化的本地指针变量“db”
在编译caffe的Windows版本时,遇到一个奇怪的问题提示:error C4703: 使用了可能未初始化的本地指针变量“db”
网上查阅资料后找到了相应的解决方法。可参考:
问题产生的原因:
在VS2012创建项目时,会有一个勾选项,叫做“安全开发生命周期(SDL)检查”,这个东西是微软在VS2012新推出的东西,为了是能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2012中就是error了。
查看MSDN中对SDL的描述,SDL检查会视以下告警为错误:
/sdl 启用警告
等效的命令行开关
一元负运算符应用于无符号类型,从而导致无符号结果。
一个负整型常数转换为无符号类型,从而导致一个可能无意义结果。
__finally /finally中的关键词,使用continue, break 或 goto在异常终止块未定义行为。
初始化变量的代码不会执行。
使用未初始化的局部变量。
对一个潜在的未初始化的局部指针变量的使用。
当使用时,请缓冲区溢出特定 C 运行时 (CRT) 函数。
使用函数的标。
使用函数的标记作为。
也就是在编译的时候,当SDL检查启用时,编译器会严格检测缓冲区的溢出,并且会在delete某个指针时,自动为这个指针定义一个非有效的值,防止在delete以后仍用到这个指针时出错。还有就是会在你定义一个对象时,自动为这个对象赋值零。
从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过。
问题解决方法:
有一个选择打开和关闭SDL检查的位置就是:项目属性-&配置属性-&C/C++-&SDL检查,选测是或者否。
此时我们选择”否”,则上面的那个错误就不会出现了
变量都要初始化一下。。。。。。。。。养成好习惯。。int *p=NULL;
安全起见,确保已经初始化。 1)用NULL初始化。#include &malloc.h&int main(int argc, char* argv[]){
int* p = NULL;
。。。。。
return 0; }2)用有效地址初始化2.1)变量地址初始化。#include &malloc.h&int main(int argc, char* argv[]){
int* p =&a;
return 0; }2.2) 为指针,分配内存。#include &malloc.h&int main(int argc, char* argv[]){
int* p = malloc(sizeof(int));
return 0; }实际上有点多余。
error C4703: 使用了可能未初始化的本地指针变量
error C4703: 使用了可能未初始化的本地指针变量“xxx”
使用了可能未初始化的本地指针变量“xxx”
没有更多推荐了,C语言中,对于未初始化的指针变量,其默认值是一个地址,该地址中的内容可能重要,也可能不重要,如果不_百度知道
C语言中,对于未初始化的指针变量,其默认值是一个地址,该地址中的内容可能重要,也可能不重要,如果不
C语言中,对于未初始化的指针变量,其默认值是一个地址,该地址中的内容可能重要,也可能不重要,如果不重要,请问我们是否有权限访问该地址啊?比如在这个地址所在的空间中存放一个数据。比如:char*scanf(&%c&,p);
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
一、指针变量的初始化问题  指针变量同普通变量一样,使用之前不仅要定义说明,而且必须进行初始化,指针的 初始值必须是一个地址,决不允许赋予任何其他数据, 通常是一个数据的地址或地址 变量或空指针。  1、指针变量未被初始化  指针变量未被初始化,指针变量就不会被分配存储空间。在程序中如果使用了未被分配 空间的指针,就会出现难以查找的错误。如在程序main(){int
x,x= 100;*p=printf(“*p=%d\n”,p);}中,指针变量p因没有初始化,在执行语句*p=之前p的内容是未知的,当程序将100赋给 一个没有确定指向内存的指针变量p,而使得数据100被存入一个未知的单元。这个程序虽然 很小,所占的内存小,问题不明显,但实质上它却隐含着一个致命的错误。这是因为随着程 序的增大,很有可能访问到致命的地址单元,将会导致计算机系统工作区域内有用数据的破 坏,引起数据段操作系统的损毁,造成机器运行失常,甚至 “死机”。  解决方法是指针必须初始化后,才能使用。  本例中 p=&x;
程序便可正常运行。  2、指针初始值可赋值为空值
  指针变量值为0的指针称为零指针(空指针)。其表示形式为int *p=0;表示p指向地 址为0的单元,系统保证该单元不作其他应用,表示指针变量值没有意义。可以写成:#define
NULL (void *)0int *p=NULL;定义零指针主要用于避免指针变量的非法引用和在程序中比较指针变量是否为空两个方 面。因此,不能把一个空指针用于除此之外的其他比较。若某些系统允许第0号内存既可以 被写入也可以被读出,这时错用空指针可能会改写操作系统的一部分内容,从而使系统彻底 崩溃;若系统只允许读0号内存,这时空指针指向一个有用的字符串;若系统对0号单元实行 写保护,则对空指针的操作将失败。.因此,使用空指针时要特别小心。  二、指针变量赋值问题  1、指针赋值带来的内存丢失  在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如:
main(){float
*b;a=(float)malloc( sizeof( float));b=(float)malloc( sizeof( float));*a= 227. 5;*b= 163. 9;a=printf(“%f,%f,*a,
*b);}  上例中将指针变量b赋给了指针变量a,使a与b都指向分配给b的内存空间,而原先分配 给a的内存空间未释放,不能再被其它任何程序访问,该内存空间成了“无效内存块”,内 存空间“丢失”了,而a后来指向的内存单元又直接或间接地被反复调用,内存愈来愈紧张 ,最终“死机”。  解决方法:一个指针变量赋给另一个指针变量前,应先用free( )释放所占有的内存空 间,使这部分空间可以由系统重新支配,即应在赋值语句前执行:free (a)。  2、指针变量赋值错误  C语言规定,一个指针变量只能指向同类型的变量,不能时而指向一个整型变量,时而 指向一个字符型变量。当然,如果程序中确实需要进行不同类型的 指针变量进行赋值时, 则需要进行强制类型转换。  3、混淆指针变量和它所指向的数据而导致程序错误如在程序main(){int x, *p;x= 10; p=printf(“%d”,*p);}中,语句p= x把数据10而不是10所对应的单元地址赋给指针变量p,因而printf()调用 语句无法在屏幕上显示x的值。  三、指针用于数组时应注意的问题  1、混淆数组名与指针变量的区别main(){int i, a[ 8];for( i= 0; i& 8; i++)scanf(“%d”,a++);}  分析:C语言中约定,指针变量是一个变量,地址为其值;数组名是一个常量指针,在 系统为数组分配存储单元时确定,其值是该数组首元素的地址。因此.数组名不能自增自减 ,也不能在赋值语句中作左值.例程中企图通过对a的改变使指针下移,指向欲输入数据的数 组元素。它的错误在于不了解数组名代表的是数组首地址,是一个地址常量,而地址常量的 值是不能改变的。  2、指针越界错误  由于对内存中数据放置的错误假定,导致指针超出数据对象所占内存空间的大小。例:main(){int a[5], b[5] ;int *p, p=a; for (i=0; i&10:i++)
*p++=i;}  分析:该程序想通过指针变量p的自加运算来完成用0~9初始化数组a和b,但这是建立 在数组a和b相邻存放的基础上的,事实上这种情况并不一定成立。  3、混淆数组与指针的区别例:main(){char *p=“beijing”;p[0]= ‘B’;}  分析:程序没有正确区分数组和指针。在C语言中,当把字符串常量赋予指针时,该字 符串常量就存储在静态存储区中。此时数据不能用指针修改,应用数组的方式进行修改。
谢谢你,请问在吗?
我有个问题想问下
采纳率:94%
来自团队:
为您推荐:
其他类似问题
指针变量的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 指针变量的使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信