我一直在解决这个问题,希望有人能解释我在哪里错了。我正在做一项需要做的任务:
1)通过调用allocIntArray分配一个可以包含100个int值的数组,并将返回的指针分配给ptr1。
2)使用new运算符使用参数作为数组的大小来分配整数数组。
3)返回新操作符返回的指针。
4)打印出新阵列。
在通过函数传递所需的大小后,我试图打印出数组。
--num-executors 2
--executor-cores 1
--executor-memory 12G
--driver memory 16G
--conf spark.streaming.dynamicAllocation.enabled=false \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.streaming.receiver.writeAheadLog.enable=false
--conf spark.executor.memoryOverhead=8192
--conf spark.driver.memoryOverhead=8192'
//我要调用的函数
int main() {
int *ptr = NULL;
ptr1 = *allocIntArray(100);
cout << ptr1 << endl;
return 0;
}
但是,当我调用该函数时,输出为00F011E8。 我目前正在尝试了解为什么这是输出而不是数组中的第一个值。 (只是数字1)
我在掌握指针方面遇到了很多麻烦,任何对理解的帮助将不胜感激。
感谢所有花时间回答的人。 从我对分配方向的理解来看,我不需要使用向量。我正在尝试修改当前代码以显示数组输出,这就是我运行它时当前显示的内容。[在此处输入图片描述My current results
答案 0 :(得分:1)
首先,如果您使用的是C ++,则应使用std :: vector / std :: array。这样可以避免大量可能的问题。
它看起来像:
#include <iostream>
#include <vector>
int main()
{
// create array of size 10 and initialize it with 0's
std::vector<int> vec(10, 0);
// print array
for(auto a : vec)
std::cout << a << '\t';
std::cout << std::endl;
}
如果是某种锻炼,您犯了四个大错误:
您将返回的指针取消引用到数组。因此,您将获得数组中第一个元素的值,而不是数组本身。只需删除*。
您将打印出数组第一个元素的地址。要打印数组,您必须遍历数组的每个元素。这可以在for循环中完成:
for(int i = 0; i < 10; ++i)
std::cout << ptr1[i] << '\t';
您要打印出未初始化的数组。实际上,您尝试打印出内存中存在的一些随机值。首先,您必须分配元素值。
您忘记使用删除数组 delete [] ptr1;
答案 1 :(得分:0)
我只是要回答,因为您似乎缺少一些重要的基础知识。要么解雇教师,要么您在课堂上没有足够的注意。所以...
ptr1 = *allocIntArray(100);
您无法粘贴可编译的代码,未声明ptr1。
您需要了解*
运算符的作用。 *
右边的值必须是pointer
。指针是您理解的基础。如果您有:
int* ptr1 = *allocIntArray(100);
您应该遇到编译器错误,因此您必须:
int ptr1;
沿线某处。当allocIntArray(...)
返回一个指针时,*allocIntArray(...)
给您一个整数。
您本来想:
int* ptr1 = allocIntArray(100);
获取指向新数组的指针。然后您:
std::cout << ptr1 << std::endl;
那么ptr1是什么?如果它是一个指针,那么您要做的就是打印指针值。根据您所说的问题,我想说ptr1实际上是一个指针。 std::cout
无法像您期望的那样使用指针。那样就无法确定数组的大小。
您可能会想(这样写会很痛):
for(size_t i= 0; i < 100; ++i)
std::cout << ptr1[i] <<" ";
但是!!
4)打印出新阵列。
那么它将打印什么?从来没有指令初始化数组。它会打印出创建数组时坐在该数组中的所有垃圾。
请注意,指导老师让您执行以下操作:
using namespace std;
可以说很多,因为他/她不应该允许它。