我目前遇到以下结构的问题:
typedef struct __attribute__((__packed__)) rungInput{
operation inputOperation;
inputType type;
char* name;
char numeroInput;
u8 is_not;
} rungInput;
我在for循环中创建了上面的多个结构,然后根据我的程序逻辑填写它们的字段:
while (a < 5){
rungInput input;
(...)
然后当我完成填充struct的字段时,我会尝试将完成的struct复制到数组中:
rungArray[a] = input; //memcpy here instead?
然后我再次遍历我的循环。我遇到一个问题,我的结构似乎都有name
值相同,尽管显然已经经历了不同的代码段并为每个循环迭代为该字段分配了不同的值。
例如,如果我有三个具有以下名称的结构:“SW1”“SW2”SW3“,在我将它们添加到我的数组后,我似乎有三个结构指向我的值”SW3“而不是这是否意味着我应该调用malloc()
手动分配每个结构中的每个指针,以确保我没有多个指向相同值的结构或者我做错了什么?
答案 0 :(得分:3)
当您编写rungArray[i] = input;
时,您正在将input
结构中的指针复制到rungArray[i]
结构中。如果随后覆盖input
结构指向的数据,则还会覆盖rungArray[i]
结构指向的数据。使用memcpy()
代替分配根本不会改变这一点。
有很多方法可以解决这个问题。最简单的方法是更改结构,以便在结构中分配足够大的数组来保存名称:
enum { MAX_NAME_SIZE = 32 };
…
char name[MAX_NAME_SIZE];
…
但是,如果名称的大小很大但平均大小很小,那么这可能会浪费太多空间。在这种情况下,您继续使用char *
,但您确实必须修改复制过程以复制具有动态分配的内存的字符串:
rungArray[i] = input;
rungArray[i].name = strdup(input.name);
请勿在放弃rungArray
时释放内存。是的,此代码复制指针然后覆盖它,但它更有弹性,因为所有字段都被复制,即使你添加了一些额外的(非指针)字段,然后特别处理指针字段。如果您依次将作业分配给每个成员,您必须记住跟踪您执行此操作的所有位置(这将是单个赋值函数,不是吗?)并在那里添加新的赋值。显示的代码主要是自动发生的。
答案 1 :(得分:0)
你应该为你的struct使用malloc内存,然后将指针存储到你的数组中的结构。您还可以通过添加指向结构的下一个实例的每个结构的指针,将结构转换为链接列表。