使用new运算符使用参数作为函数中数组的大小来分配整数数组

时间:2019-01-17 21:25:38

标签: c++ function pointers

我一直在解决这个问题,希望有人能解释我在哪里错了。我正在做一项需要做的任务:

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

2 个答案:

答案 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;
}

如果是某种锻炼,您犯了四个大错误:

  1. 您将返回的指针取消引用到数组。因此,您将获得数组中第一个元素的值,而不是数组本身。只需删除*。

  2. 您将打印出数组第一个元素的地址。要打印数组,您必须遍历数组的每个元素。这可以在for循环中完成:

for(int i = 0; i < 10; ++i) std::cout << ptr1[i] << '\t';

  1. 您要打印出未初始化的数组。实际上,您尝试打印出内存中存在的一些随机值。首先,您必须分配元素值。

  2. 您忘记使用删除数组 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;

可以说很多,因为他/她不应该允许它。