数据中嵌入了多种类型

Multiple types embedded in data

本文关键字:种类 类型 数据      更新时间:2023-10-16

是否可以在数据变量中存储多种数据类型,例如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怪癖。当我在我的机器上尝试时,我得到了和你一样的结果。奇怪的是,当我将转换移到指针增量之外时,我得到了secondininteger(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,你可能已经知道使用结构体,只是问这个,看看为什么它显示这种行为:)

是的,但是使用struct要容易得多。

你的例子似乎在我的编译器上工作,但我懒得校对它的标准遵从性(未定义的行为等),这是你应该使用struct的另一个原因:)。

由于这是标记为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;
}

看他们怎么跑!