使用将一个内部结构的地址作为参数的函数将一个内部结构的变量复制到另一个内部结构

标签 c struct structure

我有一个看起来像这样的复杂结构。

struct a
{
  struct b
  {
    int b_inner_int;
    char b_inner_char;
  }x;

  struct c
  {
    int c_inner_int;
    char c_inner_char;
  }y;

}z;

我使用一个函数,它将“struct c”的地址作为参数。现在我希望这个函数将“struct c”的值复制到“struct b”。我在 main 函数中进行的函数调用可能如下所示。

copy_val(&z.y);

现在,我该如何定义 copy_val?有什么建议么? 如果我定义一个 struct c 类型的指针,如下所示,它不起作用。

void copy_val(struct c *addr)
{
    struct c *tmp=addr;
    int tmp_int=tmp->c_inner_int;
    int tmp_char=tmp->c_inner_char;

    tmp=tmp-1; /** assuming that b and c are of same type and decrementing pointer by 1 takes to beginning of b **/

    tmp->b_inner_int=tmp_int;
    tmp->b_inner_char=tmp_char;
}

最佳答案

#include <stdio.h>
#include <stddef.h>

struct a
{
  struct b
  {
    int b_inner_int;
    char b_inner_char;
  }x;

  struct c
  {
    int c_inner_int;
    char c_inner_char;
  }y;

}z;

void copy_val(struct c *addr){
    size_t offset_c = offsetof(struct a, y);
    size_t offset_b = offsetof(struct a, x);
    struct b *bp = (struct b*)((char*)addr - offset_c + offset_b);
    bp->b_inner_int = addr->c_inner_int;
    bp->b_inner_char = addr->c_inner_char;
}

int main(void){
    z.y.c_inner_int = 1;
    z.y.c_inner_char = '1';
    copy_val(&z.y);
    printf("%d, %c\n", z.x.b_inner_int, z.x.b_inner_char);
    return 0;
}

关于使用将一个内部结构的地址作为参数的函数将一个内部结构的变量复制到另一个内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25287966/

相关文章:

c - 使用按位运算符将整数乘以 5

c++ - 使用 C++ 在结构中初始化列表容器对象?

struct 中的一个元素可以访问 C 中自身的另一个元素吗?

PHP删除结构内数组中的重复结果

c - 使用 strcat 的错误字符串连接

c - 为什么没有 LHS 的乘法在 C 语言中有效?

将 C char 数组转换为 Matlab 字符串 [Matlab Coder]

C 程序在尝试引用结构数组时崩溃

c - 结构尺寸

c++ - 是否可以将 std::list 作为 C++ 结构的成员?