我希望创建一个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。
答案 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);
或更简单的使用模板或更多指定专业化模板。