在函数内分配变量类型和大小数组(c ++)

时间:2017-07-03 10:55:33

标签: c++ arrays pointers void-pointers

我希望创建一个pointer,这意味着一个数组。数组的大小和类型(int,double,string等..)由函数决定,也由值决定。我已尝试使用void**,但我得到了segment error

char f(void** return_list){

    /*...*/

    /*If need integer array*/
    int int_input=1;         // for example
    int argument_number=2;       // for example

    return_variable=new void*[argument_number];
    for(int j=0;j<=argument_number;j++){
      return_variable[j]=new void*;
      *(int*)return_variable[j]=int_input;
    }

    /*If need boolean array*/
    /*...*/

return 0;
}

int main(int ARGC,char* ARGS[]){

char c=0; void** ret_list;
c=f(ret_list);
if(!c){std::cout<<*(int*)ret_list[0]<<"\n";}

return 0;}

注意: 我无法使用数组/指针返回函数f();我需要返回char / integer。

3 个答案:

答案 0 :(得分:2)

如果您想要的是一个函数,它创建一个在运行时决定的大小数组并将其初始化为某个值(因为您使用的是C++),我的建议是使用模板。

以下内容应该有效:

template<typename TYPE>
TYPE* f(const TYPE input, const size_t SIZE) {
    TYPE* ret = new TYPE[SIZE];
    std::fill(ret,ret+SIZE,input);  
    return ret;
}

您可以按照以下主要方式使用它:

int main()
{
    int size = 10;
    int initval = 2;

    int* p = f<int>(initval, 10);
    for (size_t i = 0; i < size; i++)
        cout << p[i] << " ";
    cout << endl;

    initval *= 2;
    size *= 2;
    double* q = f<double>(initval, size);
    for (size_t i = 0; i < size; i++)
        cout << q[i] + 0.5f << " ";

    delete[] p;
    delete[] q;
}

创建一个大小为int的{​​{1}}数组和一个类型为10的大小为20的数组,并在stdout上打印它们。

double

另外,因为您使用2 2 2 2 2 2 2 2 2 2 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 也考虑使用原始指针。请改用C++unique_ptr

答案 1 :(得分:2)

以下是该功能的两个变体。一个是你的修复,它分配一个 void 指针数组,然后分配一个指向你感兴趣的数据类型的指针。我想你是这么想的。你只需要那里的三星级酒店:-)。这是一种'C'风格。您将特别注意稍后删除所有这些内容。

第二个使用c ++样式的模板,只需分配您感兴趣的类型的数组:

#include <iostream>
using namespace std;

void allocateArrayC(void ***array, int size) {
  *array = new void *[size];
  for (int i = 0; i < size; i++)
    (*array)[i] =  new int(i);
}

template<class T>
void allocateArrayCPP(T **array, int size) {
  *array = new T[size];
  for (int  i = 0; i < size; i++)
    (*array)[i] = i;
}

int main () {
  void **arrayC;
  allocateArrayC(&arrayC, 10);
  for (int i = 0; i < 10; i++)
    cout <<  *(int*)arrayC[i] << endl;

  int *arrayCpp;
  allocateArrayCPP(&arrayCpp, 10);
  for (int i = 0; i < 10; i++)
    cout <<  arrayCpp[i] << endl;

}

答案 2 :(得分:0)

如果你想制作像我认为你可以使用的东西

void* return_variable = ::operator new[](argument_number);

或更简单的使用模板或更多指定专业化模板。