精华内容
下载资源
问答
  • 明明已经定义了due,为什么还会报警说“使用了未初始化的内存due?” ``` #include main() { float money,due; char ontime; printf("How much do you owe?"); scanf_s("%f", &money); printf("On ...
  • c语言小白,这 <p style="text-align:center"><img alt="" height="946" src="https://img-ask.csdnimg.cn/upload/1605000591843.png" width="931" /></p> 应该怎么解决 <code>#include<stdio.h> ...</p>
  • Valgrind检测使用未初始化的内存

    千次阅读 2019-05-18 10:01:14
    一点睛 对于位于程序中不同段变量,...如果程序使用了为随机数变量,那么程序行为就变得不可预期了。 二错误代码 #include<iostream> using namespace std; int main(){ int a[5]; int i,s=0; ...

    一 点睛

    对于位于程序中的不同段的变量,其初始值是不同的,全局变量和静态变量初始值为0,而局部变量和动态申请的变量,其初始值为随机值。如果程序使用了为随机数的变量,那么程序的行为就变得不可预期了。

    二 错误代码

    #include<iostream>
    using namespace std;
    int main(){
        int a[5];
        int i,s=0;
        a[0]=a[1]=a[3]=a[4]=0;
        for(i=0;i<5;i++)
                s=s+a[i];
        if(s==33)
                cout<<"sum is 33"<<endl;
        else
                cout<<"sum is not 33"<<endl;
        return 0;
    }

    三 编译并运行

    [root@localhost charpter05]# g++ -g 0509test.cpp -o 0509
    [root@localhost charpter05]# ./0509
    sum is not 33

    四 用Valgrind检测使用未初始化的内存

    [root@localhost charpter05]# valgrind ./0509
    ==17792== Memcheck, a memory error detector
    ==17792== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
    ==17792== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
    ==17792== Command: ./0509
    ==17792==
    ==17792== Conditional jump or move depends on uninitialised value(s)
    ==17792==    at 0x4008B8: main (0509test.cpp:9)
    ==17792==
    sum is not 33
    ==17792==
    ==17792== HEAP SUMMARY:
    ==17792==     in use at exit: 0 bytes in 0 blocks
    ==17792==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
    ==17792==
    ==17792== All heap blocks were freed -- no leaks are possible
    ==17792==
    ==17792== Use --track-origins=yes to see where uninitialised values come from
    ==17792== For lists of detected and suppressed errors, rerun with: -s
    ==17792== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

    五 分析

    ==17792== Conditional jump or move depends on uninitialised value(s)
    ==17792==    at 0x4008B8: main (0509test.cpp:9)

    程序的第9行,程序的跳转依赖于一个未初始化的变量a[2].Valgrind准确地发现了上述程序中存在的错误。

    展开全文
  • 因为定义指针后直接使用: *p = *x;...这样语句,虽然只是告警并显示错误,但这样做确实是超出规则,如果只看左边,p相当于是个野指针,*p当然是不行 直接用 p = x 就没有问题 别乱用就行 ...

    因为定义指针后直接使用:

    *p = *x;
    

    这样的语句,虽然只是告警并未显示错误,但这样做确实是超出规则了,如果只看左边,p相当于是个野指针,*p当然是不行的

    直接用
    p = x 就没有问题

    别乱用就行了

    展开全文
  • 警告 C6001 使用未初始化的内存“*head”。 #include #include #include #include using namespace std; typedef struct list { int number; struct list* next; }list; void build(list* head,...
  • 上次在MSDN论坛上看见一个网友问ZeroMemory用处,问题里面说他在内存上分配一个变量,但是在使用它调用一个函数时候,系统报告Access ... // 使用未初始化变量.cpp : Defines the entry point for the con

    上次在MSDN论坛上看见一个网友问ZeroMemory的用处,问题里面说他在内存上分配了一个变量,但是在使用它调用一个函数的时候,系统报告Access Violation异常,但是加上ZeroMemory以后,就运行正常了,因此他想知道ZeroMemory的用处。

     

    // 使用未初始化变量.cpp : Defines the entry point for the console application.

     

    #include "stdafx.h"

    #include <windows.h>

     

    int _tmain(int argc, _TCHAR* argv[])

    {

        STARTUPINFO info;   

        PROCESS_INFORMATION pi;

     

        ZeroMemory(&info, sizeof(info));

        ZeroMemory(&pi, sizeof(pi));

        info.cb = sizeof(info);

     

        BOOL result = ::CreateProcess(NULL,

                                          argv[1],

                                          NULL,

                                      NULL,

                                      FALSE,

                                      0,

                                      NULL,

                                      NULL,

                                      &info,

                                      &pi);

        if ( !result )

        {

            wprintf(L"CreateProcess returns %d/n", GetLastError());

            return -1;

        }

        else

        {

            ::WaitForSingleObject(pi.hProcess, INFINITE);

            ::CloseHandle(pi.hProcess);

            ::CloseHandle(pi.hThread);

            wprintf(L"CreateProcess succeeded/n");

            return 0;

        }

    }

     比如上面的代码,如果将两个ZeroMemory语句注释掉的话,在调试器里面调用CreateProcess函数的时候,你会得到一个Access Violation异常,如下图所示:

     

    堆栈看起来象下面这样:

        ntdll.dll!7c9212b0()   

        [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]

        kernel32.dll!7c81a4c8()    

        kernel32.dll!7c819da8()    

        ntdll.dll!7c92d5bc()   

        ntdll.dll!7c98d160()   

        ntdll.dll!7c969564()   

        ntdll.dll!7c93cd5b()   

        ntdll.dll!7c93947a()   

        ntdll.dll!7c938f01()   

        ntdll.dll!7c9476ea()   

        ntdll.dll!7c938f01()   

        ntdll.dll!7c947764()   

        ntdll.dll!7c98d994()   

        ntdll.dll!7c969e1c()   

        ntdll.dll!7c947764()   

        ntdll.dll!7c97d414()   

        kernel32.dll!7c802362()    

    >   使用未初始化变量.exe!wmain(int argc=2, wchar_t * * argv=0x00393250)  Line 25 + 0x25 bytes  C++

        使用未初始化变量.exe!__tmainCRTStartup()  Line 579 + 0x19 bytes    C

        使用未初始化变量.exe!wmainCRTStartup()  Line 399   C

        kernel32.dll!7c817067()    

     

     

    Windows在给你的变量分配内存的时候,只是划定一块内存区域给变量,由于物理内存是操作系统里面所有进程共享的资源,所以分配的内存区域有可能刚刚被其他程序释放掉--而这些程序写入到那一段内存的数据还没有被清空,因此如果你不用ZeroMemory将刚刚分配的内存清零的话,读取一段被其他程序写入的数据对你的程序而言是一堆垃圾,这就是为什么有的时候会出现AccessViolation的原因。

    就好比你去一个很忙的餐厅吃饭,服务员把你领到一个桌子前,这个桌子需要被擦干净你才能用一样,ZeroMemory就相当于擦桌子。

    一般来说,分配结构体变量,都需要使用ZeroMemory

     

    展开全文
  • 如图:我定义了一个简单的函数传递操作,在另一处赋值,结果vs报错“使用了未初始化的局部变量” ![图片说明](https://img-ask.csdn.net/upload/202003/25/1585145597_662090.png) ==========================...
  • 有时候需要将变量定位到闪存或者其他一些非易失性存储器中,这些变量在启动时不应该初始化,在这种情况下,可以创建一个特定的内存区域在ld文件,使用noload 指令。 网上有很多类似的教程,但是我当只定义一个段在...

    有时候需要将变量定位到闪存或者其他一些非易失性存储器中,这些变量在启动时不应该初始化,在这种情况下,可以创建一个特定的内存区域在ld文件,使用noload 指令。

    网上有很多类似的教程,但是我当只定义一个段在SDRAM中时,固件的大小也会增加,显然这是不符合要求的。

    我在tureSTUDIO用户使用文档中的一个文档找到了解决方案。
    1.更新一个段在MEMORY

    MY_DATA (rx) : ORIGIN = 0x08010000,LENGTH = 64K
    

    2.添加一个段使用未加载指令

    .my_data (NOLOAD)
    {
    	*(.MY_Data*);
    } >MY_DATA
    

    3.最后程序中声明变量时,添加段属性

    __attribute__((section(".MY_Data.a"))) int Distance
    __attribute__((section(".MY_Data.a"))) int Second
    
    展开全文
  • 错误代码: ... 由于 point 指针未初始化, point 值为任意值,它可能指向一段重要程序代码,  接着对 point 指针赋值语句则改写 point 指向内存内容,这是极其危险。   转载于...
  • <div><p>下边是一些由于使用kernel/core/tos_task.c中tos_task_create函数造成的使用未初始化变量问题,某些情况下会创建task失败。如果有不当地方请见谅! 宏定义TOS_CFG_OBJECT_VERIFY_EN > ...
  • 空指针的使用可能造成错误,指针初始化的时候赋初值而造成的野指针的错误更加可怕。  前段时间在重写opencv LK金字塔光流迭代算法(cvCalcOpticalFlowPyrLK 函数)的时候,对初始化在程序中的重要作用有更加...
  • 目录 官方概念 Valgrind 体系结构 写一个例子 ...内核类似于一个框架(framework),它模拟一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供服务完成各...
  • 因为指针初始化,所以指针所指向也是随机,他是个野指针,如果你引用指针,并修改这个指针所指向内容,而如果这个指针所指向内容恰好是另外一个程序数据话,你将其进行修改,就会导致另外一个程序可能不...
  • C++学习之内存的分配和初始化

    千次阅读 2018-10-06 13:46:50
    C++定义2个运算符来分配和释放动态内存。... // pi指向一个动态分配的、未初始化的无名对象 默认情况下,动态分配的对象是默认初始化,内置类型(int, double)或组合类型(struct)的对象的值是未定义...
  • 指针使用前先被初始化指向一块特定的内存地址...可以使用NULL这个C++特殊值来标记没被初始化的指针。每新建一个指针,你应该先将它的设置为NULL,这样可以方便以后检查 int *p_int = NULL; //可能设置,也可能不...
  • 读书笔记-内存初始化和清理

    千次阅读 2014-01-06 16:07:03
    我们知道对象初始化即被使用,是要报错,所以一般情况下在类构造方法里去赋初值,确保初始化工作完成。关于构造方法,我们可以使用不同参数类型和数目构造器。 this关键字代替对象,以调用方法,在...
  • 在c语言中,我们通常都是用memset来初始化一个结构体。但是在c++中,使用memset来初始化一个结构体,却...memset初始化的时候,是将一块固定大小的内存置空,而string,vector等的大小并不是固定的,而是会动态变化...
  • 指针的初始化

    2019-02-26 19:39:39
    标记一句废话:好长时间没写c语言了,指针一定要初始化都忘记了,发个博客提醒自己。...即使用了未初始化的变量p。 由于p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存...
  • 是有效减少编译生成出可执行文件体积,和提高程序运行前初始化内存的速度。对于栈区和堆区则没有这个概念。 一直以来对于ARM体系中所描述RO,RW和ZI数据存在似是而非理解,这段时间对其仔细了解...
  • 未初始化的指针,是不能使用的。 指针初始化:指针是地址,指针初始化就是将指针指向一段内存空间,我们通过指针操作这段内存中的数据。 1、正确写法: char ch[6]; char *p=”hello”; strcpy(ch,p); 2、错误...
  • 在C++中,对象的定义和初始化是两码事。 普通对象的初始化 例如,如果写出这样的代码: int x; 编译器将仅仅为变量x在栈上分配一块...因此,仅定义的一个数组是仅定义而初始化的;但是STL中的各种容器都实现
  • 如果使用了未初始化的a,编译器会自动为其初始化为1或0, 根据编译器的不同,初始化的字面量不同; 初始化: 为一个变量第一次指定字面量就叫初始化。 定义: 在声明一个变量的同时初始化这个变量就是定义一个变量,...
  • Capacity:vector容器的容量指的是我们一共给vector容器预留的总的内存空间,当然了总的内存空间包括“没有被使用的(初始化前不可以访问)“和”已经使用了的(这部分内存已经被初始化)“; Reverse成.
  • 1、malloc只是C标准库中提供的一个函数。 2、关于:void *,表示确定类型的指针。C,C++规定,void *类型可以强转为任何其他类型的的指针。...始终检查从malloc返回的数据,即使请求的内存量很小。 3、关于voi
  • Java初始化问题

    2018-05-06 20:14:46
    在准备阶段给类变量申请内存空间同时就通过ConstantValue属性进行初始化,在调用此变量时候,不会对此类进行初始化。2.被final修饰。在初始化阶段进行了初始化,通过类构造器&lt;clinit&gt;()方法...
  • 有堆区,栈区,BBS区(未初始化数据区),数据区(初始化了的),代码区。 其中: 栈区:由编译器自动分配释放,存放函数参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,...
  • 经过初始化的指针或者已被delete掉的指针,叫做野指针。 不初始化也能通过编译器,但指针指向哪里,你根本不知道,如果指向的是内存中比较重要的地方,可能会导致系统异常,如有时电脑会提示指向一个不可用的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 772
精华内容 308
关键字:

使用了未初始化的内存