使用char指针复制C Struct

时间:2013-09-19 15:32:01

标签: c pointers struct

首先,我真的很抱歉,如果已经被要求和解决了 - 我花了很长时间搜索并尝试调整代码示例给我我需要的东西......但遗憾的是无济于事。基本上我只是试图将一个结构的内容复制到另一个结构(这里有其他文档记录,但我不能让它工作)。

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

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元素副本确实能够复制正确的值。

谢谢!

4 个答案:

答案 0 :(得分:3)

您的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;

答案 1 :(得分:1)

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

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

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

假设您实际上正在使用

之类的东西
struct barcode *code = ...;

您正在使用上面的代码sizeof struct code字节分配,这对您的结构来说是不够的。

因此,请像这样复制:

barcodeHolder = malloc(sizeof(struct barcode));
// alternative: ... = malloc(sizeof(*code));

*barcodeHolder = *code;
barcodeHolder->text = malloc(strlen(code->text) + 1);
strcpy(barcodeHolder->text, code->text);

答案 2 :(得分:0)

或者更简单:

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

答案 3 :(得分:0)

可能不相关,但如果您的示例中的代码是指向结构的指针,那么您的sizeof是错误的。它应该是sizeof(* code)或sizeof(struct barcode)。 - Sean Bright 21小时前

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