在函数 (c++) 中分配变量类型和大小数组
Allocate variable type and size array inside function (c++)
我希望创建一个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;
}
它会在大小为10
的int
上创建一个数组和一个大小为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_ptr
或shared_ptr
。
如果你想做一些像我认为你
使用的东西void* return_variable = ::operator new[](argument_number);
或更简单使用的模板或更多指定专用化模板。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 从浮点数中删除小数部分但保留类型的有效方法
- 在函数 (c++) 中分配变量类型和大小数组
- 为什么即使在从int到两倍的类型施放后,小数也没有小数
- 由于非类型模板参数而具有零大小数组的类模板:如何防止警告
- 为什么静态大小数组类型不能是容器类型
- 小数、双精度、整数等数据类型的范围
- 使用Float或Double类型时不显示小数
- 使用'int'数据类型时出错,即使数字不是小数