【问题标题】:C4700: uninitialized local variableC4700:未初始化的局部变量
【发布时间】:2014-02-20 19:18:26
【问题描述】:

当我编译这段代码时,它会显示 “错误 C4700:使用了未初始化的局部变量 'b'”。 我不确定我现在必须做什么来解决这个问题。我既不是 IT 学生也不是技术人员,但我非常喜欢学习 C++,而且我正在自学。我已经坚持了1天。

非常感谢

#include <stdio.h>
#include <iostream>

//A. 
//1--
void InputArray(int *a, int &n)
{
    printf("Insert n = ");
    scanf("%d", &n);
    a = new int[n];
    for (int i=0; i<n; i++)
    {
        printf("Enter the key's a[%d] values: ", i);
        scanf("%d",&a[i]);
    }
}


void main()
{
    int *b, m;
    InputArray(b, m);
}

【问题讨论】:

标签: c++ console


【解决方案1】:

b 是按值传递的,这意味着将制作一个副本,但由于它没有被初始化,你会收到警告。简单地初始化它:

int *b = nullptr;

int *b = NULL;

【讨论】:

    【解决方案2】:

    如果你想让函数修改调用者的变量,那么通过引用传递:

    void InputArray(int *&a, int &n)
                         ^
    

    您的版本按值传递未初始化的指针;该函数修改了它的本地副本,但使b 处于未初始化状态。

    【讨论】:

    • 可能是真的,但不是问题的答案。
    • @MikeW:它以什么方式不回答问题?该函数显然旨在分配一个数组,并通过引用参数返回基指针和大小。警告告诉您这不会发生,因为指针是按值传递的,而调用者的变量保持不变。
    • 嗨,这两种方法都可以完全满足我在命令提示符中的需要。但是,我不太了解这个的区别: (1) void InputArray(int*& a, int& n) 不需要将 b 的值初始化为 NULL >>>>>>>> 和这一 (2) 保留函数 void InputArray(int* a, int& n),然后初始化 b >>>>>>>>>>> 但无论如何,我非常感谢您的帮助。谢谢你们俩
    【解决方案3】:

    指针未默认初始化,因此您的变量b 未初始化,这是错误的根源。你必须初始化这个变量来解决这个问题:

    void main()
    {
        int *b = NULL, m;
        InputArray(b, m);
    }
    

    修复此问题后,您的代码中还有其他问题。从您调用函数的方式看来,您希望持续更改传递给它的指针b,以便在函数返回后b 将指向分配有new 的内存。但是您通过值传递一个指针,这意味着函数中所做的更改不会反映在原始变量b 中,该变量仍将指向它在调用函数之前指向的内容。 (数组将在函数内部分配,并在函数返回后保留在内存中,但您将泄漏此内存,因为b 不会指向它)。要解决此问题,您必须 pass pointer by reference:

    void InputArray(int*& a, int& n)
    

    还有:delete 在哪里?请记住:将new 映射到delete 是双射:每个new 对应于放置在代码中某处的单个delete

    【讨论】:

    • 嗨@piotrus,谢谢您的回答,但是(1) void InputArray(int*& a, int& n) 不需要将 b 的值初始化为 NULL 有什么区别(2) 保留函数 void InputArray(int* a, int& n),然后初始化 b。很抱歉问这种新手问题,但指针对我来说太难理解了。
    • @user3247523 初始化 b 后缀是什么意思? & 需要通过引用来获取指针,以便更改传递给函数的原始指针,而不是该指针的本地副本,here 你会发现这通过示例进行了解释
    【解决方案4】:

    首先,你学会如何正确使用指针了吗?因为如果你知道如何使用指针,你应该知道,当你声明一个指针时,你需要先初始化为 NULL 才能使用它,如果我错了,请纠正我。

    例子

    int *b = nullptr;
    int *b = NULL;
    int *b = 0;
    int *b(0);
    

    都是一样的,只是方式不同

    【讨论】:

    • 你不需要初始化一个指向空值的指针:你需要用一个可能是也可能不是空的值来初始化它,你不能在这个意义上使用空指针你不能取消引用它。此外,NULL 是大多数编译器上0 的别名。另一方面,nullptr 是真正的指针类型,不同于NULL0
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2023-03-25
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多