嵌入数据中的多种类型
问题描述:
是否可以在数据变量中存储多个数据类型,例如char *?以这个例子为例,它打印出val1(一个整数)和val3到val5(字符),但打印0表示第二个整数,0.00打印浮点数。嵌入数据中的多种类型
任何线索如何做到这一点?
任何帮助表示赞赏。
#include <iostream>
static void printData(char *what) {
int val1, val2, counter = 0;
char val3, val4, val5;
float val6;
val1 = *((int *)what+counter);
counter += sizeof(int);
val2 = *((int *)what+counter);
counter += sizeof(int);
val3 = *((char *)what+counter);
counter += sizeof(char);
val4 = *((char *)what+counter);
counter += sizeof(char);
val5 = *((char *)what+counter);
counter += sizeof(char);
val6 = *((float *)what+counter);
printf("val1 = %d, val2 = %d, val3-5 = %c%c%c, val6 = %.2f", val1, val2, val3, val4, val5, val6);
}
int main (int argc, const char *argv[]) {
char *data = (char *)malloc((sizeof(int) * 2) + (sizeof(char) * 3) + sizeof(float));
int integer = 4, secondInteger = 56;
char test[3] = { 't', 'e', 's' };
float floatValue = 3.14f;
int counter = 0;
*(data) = integer;
counter += sizeof(int);
*(data + counter) = secondInteger;
counter += sizeof(int);
*(data + counter) = test[0];
counter += 1;
*(data + counter) = test[1];
counter += 1;
*(data + counter) = test[2];
counter += 1;
*(data + counter) = floatValue;
printData(data);
return 0;
}
答
嗯malloc怪癖。当我在我的机器上尝试这个功能时,我会得到和你一样的东西。奇怪的是,当我在指针增量外移动时,我得到了secondInteger(56)的正确值,但floatValue仍为0.00。不太确定解释这种行为的原因,但我敢打赌它与字节对齐有关。我需要更多地考虑它。
#include <iostream>
static void printData(char *what) {
int val1, val2, counter = 0;
char val3, val4, val5;
float val6;
val1 = *(int*)(what+counter);
counter += sizeof(int);
val2 = *(int*)(what+counter);
counter += sizeof(int);
val3 = *(char*)(what+counter);
counter += sizeof(char);
val4 = *(char*)(what+counter);
counter += sizeof(char);
val5 = *(char*)(what+counter);
counter += sizeof(char);
val6 = *(float*)(what+counter);
printf("val1 = %d, val2 = %d, val3-5 = %c%c%c, val6 = %.2f", val1, val2, val3, val4, val5, val6);
}
像AIB,我会说使用结构,但因为你是使用malloc,你可能已经知道的使用结构和只是要求这个,看看它为什么具有这种行为:)
答
由于这是C++的标签,我建议你学习一下类。这里是开始把你的代码在class
一种方法:
#include <iostream>
#include <iomanip>
#include <string>
class data
{
private:
int first_int_;
int second_int_;
std::string chars_;
float float_value_;
public:
data(int first_int, int second_int, const std::string& chars, float float_value)
:first_int_(first_int)
,second_int_(second_int)
,chars_(chars)
,float_value_(float_value)
{
}
void print(std::ostream& os) const
{
os << "val1 = "
<< first_int_
<< ", val2 = "
<< second_int_
<< ", val3-5 = "
<< chars_
<< ", val6 = "
<< std::setprecision(3)
<< float_value_
<< std::endl;
}
};
int main()
{
data d(4, 56, "tes", 3.14f);
d.print(std::cout);
return 0;
}
呀,漂亮多了。我知道我可以使用它们,但是它们会打败问题的目的,为什么它会这样做而不是打印所有的值。 –