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

Allocate variable type and size array inside function (c++)

本文关键字:类型 小数 数组 变量 分配 函数 c++      更新时间:2023-10-16

我希望创建一个pointer,这意味着一个数组。数组的大小和类型(整数、双精度、字符串等(由函数决定,也由值决定。我试过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();我需要用字符/整数返回。

以下是该函数的 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;
}

如果你想要的是一个函数,它创建一个在运行时决定的大小数组并将其初始化为某个值(因为你使用的是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;
}

它会在大小为10int上创建一个数组和一个大小为double的数组20,并在 stdout 上打印它们。

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_ptrshared_ptr

如果你想做一些像我认为你

使用的东西
void* return_variable = ::operator new[](argument_number);

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