使用指针显示数组的值
Displaying values of an array using pointers
我的问题的图像: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) ;
}
代码编译,但是,打印的数组元素不是已馈送到编译器的内容。
另外,问题天数要删除数组。这与清除堆空间有关吗?这是通过删除指向数组的指针来实现的,就像我在第二个函数中所做的那样吗?
谢谢。
在您的函数中,您静态分配大小为 10 的数组,因此它仅在函数退出之前存在。之后,你会得到未定义的行为,因为你正在从不再属于你的内存中读取随机字节。
您想要的是动态分配数组,这可以使用new
轻松完成
int* arr = new int[10];
然后你只需return arr;
当然,一旦你用完了记忆,不要忘记通过调用delete[]
来清除内存(而不是没有大括号delete
(。
作为旁注,调用return arrPtr
与调用return arr
相同,后者会自然衰减到指针。这只是错误的,因为该指针最终指向不再存在的东西。
我稍微修改了您的代码,以便它执行您的作业 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;
(,以指示它不再引用任何内容。
- 显示错误输出的简单数组排序程序
- 显示数组中的学生 ID 和最高分
- 代码使用向量成功运行,但使用数组显示错误
- 对象初始化后在C++中显示 char 数组时的异常行为
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 如何在函数中显示结构数组
- 显示结构数组
- 在数组中显示第一个元素用户输入
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 将 5 个 for 循环压缩为,将数组显示为 1
- 为什么析构函数和复制构造函数使用对象数组显示此行为
- 在VC2010中使用Char数组显示字符串时发生运行时错误
- 将数组显示为表格
- 从boost::p roperty_tree读取数组显示为空白
- c++错误数组显示
- 二维动态数组c++显示问题