我需要创建一个二维数组,其中有8行"行"但是"列"没有预先确定
沿着这个例子:
[0], ['mum', 'dad', 'uncle']
[1], ['brother', 'sister']
[2], ['friend', 'colleague', 'boss', 'employee']
.... and so on
比我必须滚动第一个索引(1到8)并读取所有列的每个可能值(对于每个"索引"我有多少元素在其中的计数。
我需要阅读类似
的内容ary[2][3] --->that would return "boss"
按照其他例子我正在使用
unsigned char (*ary)[n] = malloc(sizeof(unsigned char[8][n]));
但它没有编译并给出:
错误:无法初始化类型' unsigned char **' rvalue类型' void *'
请问我是否在C ++中正确地声明并读取了这种数组?
答案 0 :(得分:1)
如果在编译时知道行数,您可以使用std::array
std::array<std::vector<std::string>, number_of_rows>
您也可以使用
std::vector<std::string>[number_of_rows]
但使用原始数组并不像std::array
那样方便。
如果直到运行时才知道行数,则可以使用向量矢量,如
std::vector<std::vector<std::string>>
答案 1 :(得分:1)
使用C ++时,请避免使用malloc
。更喜欢使用new
。
假设n
是编译时常量,您可以使用:
unsigned char (*ary)[n] = new unsigned char[8][n];
如果n
是运行时变量,则您很可能需要使用:
unsigned char (*ary)[8] = new unsigned char[n][8];
如果出现以下情况,您可以避免处理动态分配内存的问题:
std::array
作为unsigned char
。std::vector
来捕获数据的动态特性。std::struct<std::array<unsigned char, 8>> ary(n);
答案 2 :(得分:0)
首先,这个语法比C ++更加C(例如,熟悉new
,或者数组/向量/ STL等......)。在你的情况下,如果你真的想要C语法(malloc),那么当你知道在运行时你想要多少malloc时,只需要malloc。你说你不希望所有行都使用相同的n
,所以你的行没有逻辑意义(除非是非法的):
char *a[8];
a[0] = malloc(sizeof(char)*the_amount_of_chars_plus_null_termination_in_all_strings);
/* You have to test malloc succeeded! */
/*For each row a different size, which must be known at run time*/
您没有说明如何获取每一行,因此我不知道您是否计划计算这些值,或者从输入中获取字符串,然后您可以为每一行使用strlen+1
。< / p>