【问题标题】:Multiple types embedded in data嵌入数据的多种类型
【发布时间】:2012-01-01 19:52:51
【问题描述】:

是否可以在一个数据变量中存储多种数据类型,例如 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;
}

【问题讨论】:

    标签: c++ arrays pointers types


    【解决方案1】:

    嗯,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,您可能已经知道使用结构并且只是询问它为什么会表现出这种行为:)

    【讨论】:

    • 是的,差不多。我知道我可以使用它们,但它们会破坏问题的目的,以及为什么这样做而不是打印所有值。
    【解决方案2】:

    是的,但使用struct 更容易。

    您的示例似乎正在我的编译器上运行,但我懒得校对它以符合标准(未定义的行为等)。这是您应该使用 struct 的另一个原因:)。

    【讨论】:

      【解决方案3】:

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

      See how they run!

      【讨论】:

        猜你喜欢
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 2011-05-19
        • 1970-01-01
        • 2013-11-06
        相关资源
        最近更新 更多