【问题标题】:Using functions to create and initialize an array from main in Visual Studio 2017在 Visual Studio 2017 中使用函数从 main 创建和初始化数组
【发布时间】:2020-02-17 19:48:15
【问题描述】:

数组的元素没有被初始化,因为当我运行代码时,我只看到内存中的值,而不是我在向量中设置的值。你能向我解释为什么会发生这种情况,我将来应该怎么做才能避免这个错误?请忽略我代码中的 cmets

#include <iostream>
using namespace std;

//ne va crapa deoarece nu am initializat valorile vectorului, de asta cream o functie de initializare vector

void initialisingVector(int* vector, int n, int InitialValue)
{
    for (int i = 0; i < n; i++)
    {
        vector[i] = InitialValue;
    }

}
//mereu vom pune initializarea inainte de afisare

void displayingtheVector(int vector[], int n)
{
    cout << endl << "The vector is:";
    for (int i = 0; i < n; i++)
    {
        cout << vector[i] << ",";
    }
}

int* creatingAndInitialisingtheVector(int* n)//nu avem nevoie de nr de elemente deoarece le ia din main;si nici de vector;
{//nu avem nevoie de nimic la parametrii, totusi punem n deoarece ne da eroare-n main, ai comentat acolo

//vom folosi in* n ca parametru deoarece n e o valoare ce se va modifica , prin urmare e transmisa prin pointer

//vom avea eroare cu expected ; ,nu are legatura cu ; problema este de la int[] ,expected an identifier
//nu o sa putem nici o data pune int[] la tipul unei functii, mereu vom pune int*, int[]---sa incercam sa uitam forma asta;
//INTOTDEAUNA int*

    int vectorNou[30];
    int numberElements;
    int InitialValue;

    std::cout << std::endl << "Number of elements:";
    std::cin >> numberElements;
    *n = numberElements;

    std::cout << std::endl << "Initial value is:";
    std::cin >> InitialValue;


    initialisingVector(vectorNou, numberElements, 0);
    //afisareVector(vectorNou, numarElemente); nu are sens sa o facem in fct de creare

    return vectorNou;
}


int main()
{
    int listaPreturi[30];
    int numarProduse;

    /*std::cout << std::endl<<"Numarul de produse este:";
    std::cin >> numarProduse;

    initializareVector(listaPreturi, numarProduse, 0);
    afisareVector(listaPreturi,numarProduse);
    */

    //listaPreturi=crearesiInitializareVector();//ne va trebui o variabila care sa prinda vectorul creat de functie,de asta punem listaPreturi
    //vom obtine o alta eroare dupa ce egalam variabila cu functia; expression must be a modifiable lvalue==>listaPreturi e o variabila constanta, si trebuie sa fie modifiable
    //dc avem o fct care inhtoarce un vector nu vom putea prinde vectorul nou intr-un alt vector deja creat static.
    //il va prinde u8n vetor dinamic in schimb
    int nrElements = 0;
    int* vectorNew = creatingAndInitialisingtheVector(&nrElements);//functioneaza

    //afisareVector(vectorNou, sizeof(vectorNou)); e periculos folosind sizeof(vectorNou) deoarece vectorNou are 4 , utilizatoru poate vrea mai multe elemente

    displayingtheVector(vectorNew, nrElements);
}

我希望显示具有用户设置值的向量,而不是内存地址。

【问题讨论】:

  • 通过你展示的代码,你得到的输出是什么,你期望的输出是什么?请将实际输出复制粘贴到问题中,然后粘贴实际输出并使用预期值进行修改。
  • @Someprogrammerdude 你想让我手写编译器的内存地址吗?
  • Enable warnings on your compiler。它会告诉你你做错了什么。
  • @uneven_mark 我没有编译器错误,代码也没有崩溃
  • @Corina 可能是这样,但你的程序仍然有undefined behavior,如果你启用警告,你的编译器会给你一个警告(尽管警告消息可能很难理解,因为为他们提供案例谷歌,如有必要,请在此处询问他们)。另请阅读我发布的链接。

标签: c++ oop c++11 scope


【解决方案1】:

程序有未定义的行为,因为函数creatingAndInitialisingtheVector返回指向本地数组的指针

int vectorNou[30];

退出函数后不会存活。

看来你应该用下面的方式再声明一个参数

size_t creatingAndInitialisingtheVector( int *a, size_t n );

并在main中调用函数

size_t nrElements = 
    creatingAndInitialisingtheVecto( listaPreturi, sizeof( listaPreturi ) / sizeof( *listaPreturi ) );

函数定义可以是这样的

size_t creatingAndInitialisingtheVector( int *a, size_t n)//nu avem nevoie de nr de elemente deoarece le ia din main;si nici de vector;
    {//nu avem nevoie de nimic la parametrii, totusi punem n deoarece ne da eroare-n main, ai comentat acolo

    //vom folosi in* n ca parametru deoarece n e o valoare ce se va modifica , prin urmare e transmisa prin pointer

    //vom avea eroare cu expected ; ,nu are legatura cu ; problema este de la int[] ,expected an identifier
    //nu o sa putem nici o data pune int[] la tipul unei functii, mereu vom pune int*, int[]---sa incercam sa uitam forma asta;
    //INTOTDEAUNA int*

        size_t numberElements;
        int InitialValue;

        std::cout << std::endl << "Number of elements:";
        std::cin >> numberElements;

        if ( n < numberElements ) numberElements = n;

        std::cout << std::endl << "Initial value is:";
        std::cin >> InitialValue;

        initialisingVector( a, numberElements, InitialValue);
        //afisareVector(vectorNou, numarElemente); nu are sens sa o facem in fct de creare

        return numberElements;
    }

【讨论】:

    【解决方案2】:

    在您的函数creatingAndInitialisingtheVector 内部,您正在返回一个指向内存的指针,一旦函数返回,该指针将超出范围。内存被分配给函数的范围,并在返回后被释放。我建议阅读范围以及如何为 C++ 中的数组等内容分配内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多