【问题标题】:Displaying values of an array using pointers使用指针显示数组的值
【发布时间】:2019-01-28 16:43:38
【问题描述】:

我的问题图片:https://i.stack.imgur.com/x5VQW.png

总而言之,在一个函数 readNumbers 中,我将创建一个大小为 10 的数组,并返回一个指向该数组的指针。 然后我有第二个函数 printNumbers,它从上述函数中获取指针(以及数组的长度,10)并打印数组中的索引和相应的值。

我的函数文件:

#include <iostream>
using namespace std;

int *readNumbers() 
{
    int arr[10];
    for (int i=0; i<10; i++) //asking for 10 values
    {
        cout<<"Enter an element: ";
        cin>>arr[i];
    }

    int *arrPtr;
    arrPtr=&arr[0];

    return arrPtr;

}




 void printNumbers(int *numbers,int length) 
{


    for (int i=0; i<length; i++)
    {
        cout<<i<<" "<<*(numbers+1)<<endl;
    }
    delete numbers;

}

主文件:

int *readNumbers() ;
void printNumbers(int *numbers,int length) ;

int main (void)
{



    printNumbers(readNumbers(), 10) ;


}

代码会编译,但是,打印的数组元素不是输入编译器的元素。

还有,要删除数组的问题天数。这与清除堆空间有关吗?这是通过删除指向数组的指针来实现的,就像我在第二个函数中所做的那样?

谢谢。

【问题讨论】:

  • 请注意:输入不会输入编译器。编译过程发生在程序运行之前。
  • 使用std::array&lt;int, 10&gt;std::vector&lt;int&gt;
  • 描述中的“动态分配”这几个字很重要。你要么错过了那个细节,要么没有意识到它们的重要性。

标签: c++ arrays pointers dynamic memory-address


【解决方案1】:

在您的函数中,您静态分配了一个大小为 10 的数组,因此它仅在函数退出之前存在。之后,您会得到未定义的行为,因为您正在从不再属于您的内存中读取随机字节。

你想要的是动态分配数组,这可以使用new轻松完成

int* arr = new int[10];

那你只需return arr;

当然,一旦你完成使用它,不要忘记通过调用delete[](而不是没有大括号的delete)来清除内存。

附带说明,调用return arrPtr 与调用return arr 相同,后者自然会衰减为指针。这只是错误的,因为该指针最终指向不再存在的东西。

【讨论】:

  • [] 后面的delete 很重要!
【解决方案2】:

我已经稍微修改了您的代码,以便它可以满足您在作业https://i.stack.imgur.com/x5VQW.png 中的要求

我的代码:

#include <cstdlib>
#include <iostream>
using namespace std;

int *readNumbers() {
   int *arr = new int[10];
   for (int i = 0; i < 10; i++) //asking for 10 values
   {
      cout << "Enter an element: ";
      cin >> arr[i];
   }
   return arr;
}

void printNumbers(int *numbers, int length) {

   for (int i = 0; i < length; i++) {
      cout << i << " " << numbers[i] << endl;
   }
   delete[]numbers;
}

int main() {
   printNumbers(readNumbers(), 10);
   return 0;
}

回答您的第一个问题: 局部数组,例如 int array[10];,在堆栈上分配,并在它们所在的函数结束时被销毁。这就是为什么在稍后尝试打印数组内容时从内存中读取随机字节的原因。

当我们写int *arr = new int[10]; 时,我们在堆上分配我们的数组。该数组的地址被返回并分配给名为arr 的指针。指针arr 依次分配到栈上。 但是,当您使用 new 运算符在堆上分配某些东西(例如数组)时,当您不再需要它来释放数组时,您应该使用 delete 运算符。否则,如果您继续使用new 而不稍后使用delete,您的堆空间将用完,您的程序将崩溃。

回答你的第二个问题: 当您使用delete 运算符(或delete[],在数组的情况下)时,您实际上是在删除arr 指针在堆上指向的内容。使用 delete 运算符后,指针 arr 不会从堆栈中删除。它变成了所谓的“悬空指针”——一个不再指向堆上有效内容的指针。当我们从声明它的函数(作用域)中终止时,它将与我们可能拥有的其他局部变量一起从堆栈中删除。但是,在删除指针指向的内容后,您可以为其分配 NULL (arr = NULL;),以表明它不再引用任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多