我想在c ++中创建锯齿状的二维数组。
int arrsize[3] = {10, 5, 2};
char** record;
record = (char**)malloc(3);
cout << endl << sizeof(record) << endl;
for (int i = 0; i < 3; i++)
{
record[i] = (char *)malloc(arrsize[i] * sizeof(char *));
cout << endl << sizeof(record[i]) << endl;
}
我想为record[0]
设置名称(应该有10个字母),record[1]
用于标记(应该有5位数字)和record[3]
用于ID(应该有2位数字) 。我该如何实现呢?我直接将记录数组写入二进制文件。我不想使用struct
和class
。
答案 0 :(得分:5)
在C ++中它想要这样:
std::vector<std::string> record;
答案 1 :(得分:2)
为什么在你的问题是明智的解决方案时不使用结构?
struct record {
char name[10];
char mark[5];
char id[2];
};
然后写入二进制文件变得微不足道了:
record r = get_a_record();
write( fd, &r, sizeof r );
注意:
您可能希望为NUL终结器分配一些额外空间,但这取决于您要在文件中使用的格式。
如果您要写入二进制文件,为什么要将mark
和id
写为字符串?为什么不存储int
(4个字节,更大范围的值)和unsigned char
(1个字节)
如果你坚持不使用用户定义的类型(真的,你应该),那么你可以创建一个单独的内存块并使用指针算法,但要注意编译器生成的二进制文件将是相同的,唯一的区别是你的代码可维护性较差:
char record[ 10+5+2 ];
// copy name to record
// copy mark to record+10
// copy id to record+15
write( fd, record, sizeof record);
答案 2 :(得分:0)
实际上,“to malloc”的正确模式是:
T * p = (T *) malloc(count * sizeof(T));
其中T
可以是任何类型,包括char *
。因此,在这种情况下分配内存的正确代码就是:
int arrsize[3] = { 10, 5, 2 };
char** record;
record = (char**) malloc(3 * sizeof(char *));
cout << sizeof(record) << endl;
for (int i = 0; i < 3; ++i) {
record[i] = (char *) malloc(arrsize[i] * sizeof(char));
}
我删除了cout'ing sizeof(record[i])
,因为它总是会产生(一个)指向char的指针(我的笔记本电脑上有4个)。 sizeof是编译时间的东西,不知道record[i]
(实际上是指针 - char *
类型)在执行时间内分配了多少内存。
答案 3 :(得分:0)
malloc(3)
分配3个字节。您的锯齿状数组将是一个包含指向字符数组的指针的数组。每个指针通常占用4个字节(在32位机器上),但更正确sizeof(char*)
,因此您应该使用malloc(3 * sizeof(char*) )
进行分配。
然后record[i] = (char*)malloc((arrsize[i]+1) * sizeof(char))
,因为字符串是char*
而字符是char
,并且因为每个C风格的字符串通常以'\0'
字符终止表明它的长度。你可以没有它,但例如它会更难使用:
strcpy(record[0], name);
sprintf(record[1], "%0.2f", mark);
sprintf(record[2], "%d", id);
填写您的记录,因为sprintf
最后会放入\0
。我假设mark
是一个浮点数,id
是一个整数。
关于将所有这些写入文件,如果文件是二进制文件,为什么首先将所有内容放入字符串中? 假设你这样做,你可以使用类似的东西:
ofstream f("myfile",ios_base::out|ios_base::binary);
for (int i=0; i<3; i++)
f.write(record[i], arrsize[i]);
f.close();
话虽这么说,我是安德斯的第二个想法。如果你使用STL向量和字符串,你将不必处理丑陋的内存分配,你的代码也可能看起来更干净。