我的问题的图片: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) ;
}
代码可以编译,但是,打印出来的数组元素不是已经送入编译器的元素。
此外,要删除阵列的问题天数。这与清除堆空间有关吗?是否像我在第二个函数中所做的那样通过删除指向数组的指针来实现的?
谢谢。
答案 0 :(得分:2)
在函数中,您静态分配了一个大小为10的数组,因此该数组仅在函数退出之前存在。在那之后,您将获得不确定的行为,因为您正在从不再属于您的内存中读取随机字节。
您想要的是动态分配数组,这可以使用new
int* arr = new int[10];
然后您只需return arr;
当然,使用完内存后,不要忘记通过调用delete[]
(而不是delete
不带花括号)来清除内存。
请注意,调用return arrPtr
与调用return arr
相同,后者自然会衰减为指针。这是唯一的错误,因为该指针最终指向不再存在的对象。
答案 1 :(得分:0)
我已经对您的代码进行了一些修改,以使其能够完成您的任务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
指针。使用arr
运算符后,指针delete
不会自动从堆栈中删除。它被称为“悬空指针”-不再指向堆上有效对象的指针。当我们从声明它的函数(作用域)中终止时,它将与其他可能的局部变量一起从堆栈中删除。但是,在删除指针指向的内容之后,可以为其分配一个NULL(arr = NULL;
),以指示该指针不再引用任何内容。