【问题标题】:Copy C Struct with char pointer使用 char 指针复制 C 结构
【发布时间】:2013-09-19 15:32:00
【问题描述】:

首先,如果已经提出并解决了这个问题,我真的很抱歉 - 我花了很长时间搜索并尝试修改代码示例来满足我的需求......但遗憾的是无济于事。本质上,我只是想将一个结构的内容复制到另一个结构(此处记录在其他地方,但我无法让它工作)。

扫描仪在读取条形码时会填充以下结构:

struct barcode
{
    char *text;
    int length;
    int id;
    int min;
    int max;
};

这被实例化为:

static struct barcode code = {0};

我实例化另一个相同类型的:

struct barcode *barcodeHolder;

这旨在存储扫描条形码的副本。这是因为随后将扫描指示其他步骤的其他代码,例如条形码以指示数字或阶段(例如,结束、开始等)。一旦我想将结构内容写入磁盘,我就会使用结构的“副本”,因为这正是我想要的。

但是,char *text 属性始终等于 'c' 而不是条形码的值。

我将它们复制如下:

barcodeHolder = malloc(sizeof(code));
barcodeHolder->text = malloc(strlen(code->text) + 1);
strcpy(barcodeHolder->text, code->text);
barcodeHolder->id   = code->id;
barcodeHolder->length = code->length;
barcodeHolder->max = code->max;
barcodeHolder->min = code->min;

这是我从其他类似主题的帖子中得到的。

但是,我显然在做一些愚蠢的错误,并且欢迎任何人提供任何帮助,以便我的 struct text 元素副本确实得到正确的值。

谢谢!

【问题讨论】:

  • 可能不相关,但如果您的示例中的 code 是指向结构的指针,那么您的 sizeof 是错误的。应该是sizeof(*code)sizeof(struct barcode)
  • @zubergu 不是一个好主意 - 他有一个 char 指针作为成员。
  • 暂时忽略复制问题,原始“文本”是否包含正确的数据?它是没有嵌入空值的实际文本数据吗?您是否应该为文本字段和文本中的 memcpy() 分配“长度”字节?
  • 如何操作code 变量?根据您在问题中给出的声明,其中没有任何初始化...
  • @SeanBright 辉煌,谢谢!我只是错过了 sizeof(*code) 中的星号。现在一切正常!一直以来,我都是成功的一个角色!非常感谢你的帮助! :-)

标签: c pointers struct


【解决方案1】:

您的code 不是指针

你需要这个:

barcodeHolder = malloc(sizeof(code));
barcodeHolder->text = malloc(strlen(code.text) + 1);
strcpy(barcodeHolder->text, code.text);
barcodeHolder->id = code.id;
barcodeHolder->length = code.length;
barcodeHolder->max = code.max;
barcodeHolder->min = code.min;

【讨论】:

    【解决方案2】:

    我不相信你的代码真的是:

    static struct barcode code = {0};
    [..]
    strcpy(barcodeHolder->text, code->text);
    

    因为最后一条语句会产生编译错误 - 因为code 不是指针,所以您必须在那里使用code.text(而不是code->text)。

    假设您实际上正在使用类似的东西

    struct barcode *code = ...;
    

    您正在使用struct code 字节的上述代码 sizeof 指针进行分配,这对于您的结构来说是不够的。

    因此,像这样复制它:

    barcodeHolder = malloc(sizeof(struct barcode));
    // alternative: ... = malloc(sizeof(*code));
    
    *barcodeHolder = *code;
    barcodeHolder->text = malloc(strlen(code->text) + 1);
    strcpy(barcodeHolder->text, code->text);
    

    【讨论】:

      【解决方案3】:

      或者,更简单地说:

      barcodeHolder = malloc(sizeof(code));
      *barcodeHolder = code;
      barcodeHolder->text = strdup(code.text);
      

      【讨论】:

        【解决方案4】:

        可能不相关,但如果您示例中的代码是指向结构的指针,那么您的 sizeof 是错误的。它应该是 sizeof(*code) 或 sizeof(struct 条形码)。 – 肖恩·布莱特 21 小时前

        @SeanBright 我绝不会称自己为 C 程序员——永远! - 所以你完全保存在这里!谢谢你。不,“代码”不是程序中的指针,这也让我感到困惑......这可能是我无法到达任何地方的原因。我只需要让它工作来证明我们可以做一个演示。如果它取得进展,我会回来(希望如此!)并重新访问代码以更好地理解它为什么在它可能不应该工作的情况下工作。再次感谢!!!

        【讨论】:

          猜你喜欢
          • 2013-05-15
          • 2018-05-05
          • 2011-03-19
          • 1970-01-01
          • 2018-11-03
          • 1970-01-01
          • 1970-01-01
          • 2020-01-04
          • 1970-01-01
          相关资源
          最近更新 更多