C结构共享公共指针?

C结构共享公共指针?,c,arrays,pointers,struct,memcpy,C,Arrays,Pointers,Struct,Memcpy,我当前对以下结构有问题: typedef struct __attribute__((__packed__)) rungInput{ operation inputOperation; inputType type; char* name; char numeroInput; u8 is_not; } rungInput; 我在for循环中创建了多个如上所述的结构,然后根据

我当前对以下结构有问题:

typedef struct  __attribute__((__packed__)) rungInput{

operation inputOperation;   
inputType type;             
char* name;             
char numeroInput;           
u8 is_not;                  

} rungInput;
我在for循环中创建了多个如上所述的结构,然后根据我的程序逻辑填充它们的字段:

while (a < 5){
rungInput input;


(...)
然后我再次遍历我的循环。我遇到了一个问题,我的结构似乎所有的
名称
值都是相同的,尽管每个循环迭代都经历了不同的代码段,并为该字段分配了不同的值


例如,如果我有三个名为“SW1”“SW2”“SW3”的结构,在我将它们添加到数组中之后,我似乎让所有三个结构都指向值“SW3”。这是否意味着我应该调用
malloc()
要手动分配每个结构中的每个指针,以确保我没有多个指向相同值的结构,或者我做了其他错误吗?

您应该为结构malloc内存,然后将指向结构的指针存储在数组中。您还可以通过添加poi将结构转换为链接列表指向指向结构的下一个实例的每个结构


您应该为结构malloc内存,然后将指向结构的指针存储在数组中。您还可以通过添加指向指向结构下一个实例的每个结构的指针,将结构转换为链表


您应该为结构malloc内存,然后将指向结构的指针存储在数组中。您还可以通过添加指向指向结构下一个实例的每个结构的指针,将结构转换为链表


您应该为结构malloc内存,然后将指向结构的指针存储在数组中。您还可以通过添加指向指向结构下一个实例的每个结构的指针,将结构转换为链表


当您写入
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
时,请记住释放内存。是的,此代码复制指针,然后将其覆盖,但它更易于更改,因为所有字段都被复制,即使您添加了一些额外的字段(非指针)字段,然后指针字段被专门处理。如果您依次向每个成员写入赋值,您必须记住跟踪所有执行此操作的位置(这将是一个赋值函数,不是吗?)然后在那里添加新的赋值。显示代码后,这通常会自动发生。

当您编写
rungArray[i]=input;
时,您正在将
input
结构中的指针复制到
rungArray[i]中
structure。如果随后覆盖了
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
时,请记住释放内存。是的,此代码复制指针,然后将其覆盖,但它更易于更改,因为所有字段都被复制,即使您添加了一些额外的字段(非指针)字段,然后指针字段被专门处理。如果您依次向每个成员写入赋值,您必须记住跟踪所有执行此操作的位置(这将是一个赋值函数,不是吗?)然后在那里添加新的赋值。显示代码后,这通常会自动发生。

当您编写
rungArray[i]=input;
时,您正在将
input
结构中的指针复制到
rungArray[i]中
structure。如果随后覆盖了
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
时,请记住释放内存。是的,此代码复制指针,然后覆盖它,但它更容易更改,因为所有字段都会被复制,即使您添加了一些ext