【问题标题】:C structs sharing common pointer?C结构共享公共指针?
【发布时间】:2014-11-16 05:24:02
【问题描述】:

我目前遇到以下结构的问题:

typedef struct  __attribute__((__packed__)) rungInput{

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

} rungInput;

我在 for 循环中创建了多个类似上面的结构,然后根据我的程序逻辑填写它们的字段:

while (a < 5){
rungInput input;


(...)

然后,当我完成适当地填充结构的字段后,我会尝试将完成的结构复制到这样的数组中:

rungArray[a] = input; //memcpy here instead?

然后我再次遍历我的循环。我遇到了一个问题,我的结构似乎都具有相同的 name 值,尽管显然已经经历了不同的代码段并为每次循环迭代为该字段分配了不同的值。

例如,如果我有三个具有以下名称的结构:“SW1”“SW2”SW3”,在我完成将它们添加到我的数组后,我似乎让所有三个结构都指向值“SW3” . 这是否意味着我应该调用malloc() 来手动分配每个结构中的每个指针,以确保我没有多个指向相同值的结构或者我做错了什么?

【问题讨论】:

  • 请贴出实际代码sn-p。
  • 为什么对__attribute__((__packed__)) 及其亲属如此着迷?它们被滥用而不是被使用,尤其是在所示示例中。
  • 不要使用__attribute__((__packed__)),尤其是包含指针的struct(它很可能会大大降低您的代码速度)。

标签: c arrays pointers struct memcpy


【解决方案1】:

当您编写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 时释放内存。是的,这段代码复制了指针,然后覆盖了它,但是它更有弹性,因为所有的字段都被复制了,即使你添加了一些额外的(非指针)字段,然后对指针字段进行了特殊处理。如果您依次为每个成员编写作业,则必须记住跟踪您执行此操作的所有位置(这将是一个单一的作业功能,不是吗?)并在那里添加新作业。使用显示的代码,这主要是自动发生的。

【讨论】:

    【解决方案2】:

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

    http://www.cprogramming.com/tutorial/c/lesson15.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      相关资源
      最近更新 更多